从键盘输入一些字符,把它们逐个送到磁盘中去,知道输入#为止


#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *in,*out;
    char ch,infile[10],outfile[10];
    printf("输入读入文件的名字:");
    scanf("%s",infile);
    printf("输入输出文件的名字:");
    scanf("%s",outfile);
    if((in=fopen(infile,"r"))==NULL)   //打开一个输入文件 
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    if((out=fopen(infile,"w"))==NULL)  //打开一个输出文件 
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    ch=fgetc(in);
    while(!feof(in))    //如果未遇到输入文件的结束标志 
    {
        fputc(ch,out);
        putchar(ch);    //将ch显示到屏幕上 
        ch=fgetc(in);
    }
    putchar(10);        //显示完全部字符后换行 
    fclose(in);
    fclose(out);
    return 0;
} 

img


这个程序可以运行成功,但是在电脑上按笔记本的打开方式打开文件,里面什么都没有,这是为什么

fputc(ch,out);
这里下断点,调试下,看看是否真的有写入
另外检查文件是否是你打开看到的那个,是不是写到别的目录下去了。

第17行的infile应为outfile,即以写模式打开outfile代表的文件;

然后如果是需要从输入获取字符的话, 还需要增加获取输入和写入文件的代码。

修改如下:

参考链接:


 
 
#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *in,*out;
    char ch,infile[100],outfile[100];
    printf("输入读入文件的名字:");
    scanf("%s",infile);
    printf("输入输出文件的名字:");
    scanf("%s",outfile);
    
   // printf("infile=%s, outfile=%s\n",infile,outfile);
       // 假设先从输入读取字符输入infile文件 
       if((in=fopen(infile,"w"))==NULL)   //打开一个输入文件 
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    
    fflush(stdin);  // 清空缓冲区 
       printf("请输入文件的内容:\n");
       // 从输入获取字符,然后写入文件infile,直到输入'#'停止 
       while((ch=getchar())!='#'){
           fputc(ch,in);
    }
    fclose(in);
       
       
       // 再将infile文件的内容复制到outfile 
    // https://blog.csdn.net/kangjianwei101/article/details/50517536 
    if((in=fopen(infile,"r"))==NULL)   //打开一个输入文件 
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    
    // 以写模式打开文件名为outfile的文件 ,这里应为outfile 
    if((out=fopen(outfile,"w"))==NULL)  //打开一个输出文件 
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    ch=fgetc(in);
    while(!feof(in))    //如果未遇到输入文件的结束标志 
    {
        fputc(ch,out);
        putchar(ch);    //将ch显示到屏幕上 
        ch=fgetc(in);
    }
    putchar(10);        //显示完全部字符后换行 
    fclose(in);
    fclose(out);
    return 0;
} 

img

基于new bing的编写:
在你提供的代码中,有一个错误导致输出文件为空。问题在于打开输出文件时,使用了与输入文件相同的文件名,应该改为使用outfile变量来指定输出文件的文件名。以下是修改后的代码:

#include<stdio.h>
#include<stdlib.h>

int main() {
    FILE *in, *out;
    char ch, infile[10], outfile[10];
    
    printf("输入读入文件的名字:");
    scanf("%s", infile);
    
    printf("输入输出文件的名字:");
    scanf("%s", outfile);
    
    if ((in = fopen(infile, "r")) == NULL) {   // 打开一个输入文件
        printf("无法打开此文件\n");
        exit(0);
    }
    
    if ((out = fopen(outfile, "w")) == NULL) {  // 打开一个输出文件
        printf("无法打开此文件\n");
        exit(0);
    }
    
    ch = fgetc(in);
    
    while (!feof(in)) {    // 如果未遇到输入文件的结束标志
        fputc(ch, out);
        putchar(ch);    // 将ch显示到屏幕上 
        ch = fgetc(in);
    }
    
    putchar(10);        // 显示完全部字符后换行 
    fclose(in);
    fclose(out);
    
    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/340094
  • 这篇博客也不错, 你可以看下已存入数组中的数据值已经按由小到大的顺序存放,现从键盘输入一个数据,把它插入到数组中,要求插入新数据以后,数组数据仍然保持有序。请编写一个程序实现上述功能。
  • 除此之外, 这篇博客: 双链表各种基本运算的算法中的  在双链表中,由于每个结点既包括一个指向后继结点的指针有包括一个指向前驱结点的指针,当访问一个结点后既可以依次向后访问又可以依次向前访问。与单链表相比,双链表中访问一个结点的前后结点更便捷。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include<stdio.h>
    #include<malloc.h>
    typedef int ElemType;
    typedef struct DNode
    {
    	ElemType data;//存放元素值
    	struct DNode *prior;//指向前驱结点
    	struct DNode *next;//指向后继结点
    }DLinkNode;//双链表的结点类型
    void CreateListF(DLinkNode *&L, ElemType a[], int n)//头插法建立双链表
    {
    	DLinkNode *s;
    	L = (DLinkNode*)malloc(sizeof(DLinkNode));
    	L->next = NULL;
    	for (int i = 0; i < n; i++)
    	{
    		s = (DLinkNode*)malloc(sizeof(DLinkNode));
    		s->data = a[i];
    		s->next = L->next;
    		if (L->next!= NULL)
    			L->next->prior = s;
    		L->next = s;
    		s->prior = L;
    	}
    	s = L->next;
    	while (s->next != NULL)
    		s = s->next;
    	s->next = L;
    	L->prior = s;
    }
    void CreateListR(DLinkNode*&L, ElemType a[], int n)//尾插法建立双链表
    {
    	DLinkNode *s, *r;
    	L = (DLinkNode*)malloc(sizeof(DLinkNode));
    	L->next = NULL;
    	r = L;
    	for (int i = 0; i < n; i++)
    	{
    		s = (DLinkNode*)malloc(sizeof(DLinkNode));
    		s->data = a[i];
    		r->next = s;
    		s->prior = r;
    		r = s;
    	}
    	r->next = L;
    	L->prior = r;
    }
    void InitList(DLinkNode*&L)//初始化线性表
    {
    	L = (DLinkNode*)malloc(sizeof(DLinkNode));
    	L->prior = L->next = L;
    
    }
    void DestroyList(DLinkNode *&L)//销毁线性表
    {
    	DLinkNode *pre = L, *p = pre->next;
    	while (p != L)
    	{
    		free(L);
    		pre = p;
    		p = pre->next;
    	}
    	free(pre);
    }
    bool ListEmpty(DLinkNode *L)//判断线性表是否为空
    {
    	return(L->next = NULL);
    }
    int ListLength(DLinkNode *L)//求线性表的长度
    {
    	DLinkNode *p = L;
    	int i = 0;
    	while (p->next != L)
    	{
    		i++;
    		p = p->next;
    	}
    	return i;
    }
    void DispList(DLinkNode *L)//输出线性表
    {
    	DLinkNode *p= L->next;
    	while (p != L)
    	{
    		printf("%c", p->data);
    		p = p->next;
    	}
    	printf("\n");
    }
    bool GetElem(DLinkNode *L, int i, ElemType &e)//求线性表第i个元素值
    {
    	int j = 1;
    	DLinkNode *p = L->next;
    	if (i <= 0 || L->next == L)
    		return false;
    	while (j < i&&p != NULL)
    	{
    		j++;
    		p = p->next;
    	}
    	if (p == NULL)
    		return false;
    	else
    	{
    		e = p->data;
    		return true;
    	}
    }
    int LocateElem(DLinkNode *L, ElemType e)//查找第一个值域为e的元素序号
    {
    	int i = 1;
    	DLinkNode *p = L->next;
    	while (p != NULL && p->data != e)
    	{
    		i++;
    		p = p->next;
    	}
    	if (p == NULL)
    		return false;
    	else
    		return i;
    }
    bool ListInsert(DLinkNode *&L, int i, ElemType e)//插入第i个元素
    {
    	int j = 0;
    	DLinkNode *p = L, *s;
    	if (i < 0)
    		return false;
    	while (j < i - 1 && p != NULL)
    	{
    		j++;
    		p = p->next;
    	}
    	if (p == NULL)
    		return false;
    	else
    	{
    		s = (DLinkNode*)malloc(sizeof(DLinkNode));
    		s->data = e;
    		s->next = p->next;
    		if (p->next != NULL)
    			p->next->prior = s;
    		s->prior = p;
    		p->next = s;
    		return true;
    	}
    }
    bool ListDelete(DLinkNode*&L, int i, ElemType &e)//删除第i个元素
    {
    	int j = 0;
    	DLinkNode *p = L, *q;
    	if (i <= 0)
    		return false;
    	while (j < i - 1 && p != NULL)
    	{
    		j++;
    		p = p->next;
    	}
    	if (p == NULL)
    		return false;
    	else {
    		q = p->next;
    		if (q == NULL)
    			return false;
    		e = q->data;
    		p->next = q->next;
    		if (p->next != NULL)
    			p->next->prior = p;
    		free(q);
    		return true;
    	}
    }
    int main()
    {
    	DLinkNode *h;
    	ElemType e;
    	printf("双链表的基本运算如下:\n");
    	printf(" (1) 初始化双链表h\n");
    	InitList(h);
    	printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");
    	ListInsert(h, 1, 'a');
    	ListInsert(h, 2, 'b');
    	ListInsert(h, 3, 'c');
    	ListInsert(h, 4, 'd');
    	ListInsert(h, 5, 'e');
    	printf(" (3)输出双链表h:\n");
    	DispList(h);
    	printf(" (4)双链表h长度:%d\n", ListLength(h));
    	printf(" (5)双链表h为%s\n", (ListEmpty(h) ? "空" : "非空"));
    	GetElem(h, 3, e);
    	printf(" (6)双链表h的第3个元素:%c\n", e);
    	printf(" (7)元素a的位置:%d\n", LocateElem(h, 'a'));
    	printf(" (8)在第4个元素位置上插入f元素\n");
    	ListInsert(h, 4, 'f');
    	printf(" (9)输出双链表h:\n");
    	DispList(h);
    	printf(" (10)删除h的第3个元素\n");
    	ListDelete(h, 3, e);
    	printf(" (11)输出双链表h:\n");
    	DispList(h);
    	printf(" (12)释放双链表h\n");
    	DestroyList(h);
    	return 1;
    
    }

    有错请指正!

     

     

  • 您还可以看一下 刘伶华老师的软件测试经典面试题剖析课程中的 工作中有遇到什么困难,怎么解决的?小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

供参考:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    FILE *in,*out;
    char ch,infile[32],outfile[32];
    printf("输入读入文件的名字:");
    scanf("%s",infile);
    printf("输入输出文件的名字:");
    scanf("%s",outfile);
    if((in=fopen(infile,"wt"))==NULL)
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    printf("从键盘输入字符,以'#'结束:\n");//修改
    getchar();    //修改
    while((ch = getchar()) != '#') // while(!feof(in)) 修改
    {
        fputc(ch, in);
        putchar(ch);//将ch显示到屏幕上
    }
    fputc('#', in);
    fclose(in);

    // 以下将文件1复制到另一个文件2
    if((in=fopen(infile,"rt"))==NULL)
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    if((out=fopen(outfile,"wt"))==NULL) //if((out=fopen(infile,"w"))==NULL)修改
    {
        printf("无法打开此文件\n");
        exit(0);
    }
    while ((ch = fgetc(in)) != '#')  fputc(ch, out);
    fputc('#', out); //修改
    fclose(in);
    fclose(out);
    return 0;
}