问题如下:
写一个程序拷贝文件:
使用所学文件操作,在当前目录下放一个文件data.txt,写一个程序,将data.txt文件拷贝一份,生成data_copy.txt文件。
基本思路:
- 打开文件data.txt,读取数据
- 打开文件data_copy.txt,写数据
- 从data.txt中读取数据存放到data_copy.txt文件中,直到文件结束。
- 关闭两个文件
所以我们需要的函数有 fopen()(用来打开文件),fputs()(文本行输出,写一个字符串),fclose()(用来关闭文件),fgetc()(读文件,读一个字符),fputc()(字符输出,写进一个字符)。
函数实现如下:
int main()
{FILE* p1 = fopen("data.txt", "w"); //创建文件指针变量存储打开的文件的地址if (p1 == NULL) //如果打败失败就是指针为空{perror("fopen"); //就输出错误return 1; //提前结束程序} fputs("hello world test\n", p1); //写进去一个hello world test通过指针p1进入这个data.txt文件fclose(p1); //关闭文件p1 = NULL; //关闭文件后,相应的指针需要置空FILE* p2 = fopen("data.txt", "r"); //"r"——只读,读取我们想要拷贝的源头文件FILE* p3 = fopen("data_copy.txt", "w"); //"w"——只写,拷贝我们所需的目标文件if (p2 == NULL && p3 == NULL) //如果打开失败就返回空指针{perror("fopen"); //输出相应的错误return 1; //提前结束程序}int ch = 0;while ((ch = fgetc(p2)) != EOF) //ch=fgets(p2) 用while循环,每次读取一个字符赋值给ch,当文件读取完毕之后会返回EOF值,所以判断条件就为此代码{fputc(ch, p3); //将ch的值拷贝到p3所指向的文件中}fclose(p2); fclose(p3);p2 = p3 = NULL;return 0;
}
我们查看文件
可以看到,我们成功拷贝了。
但是我们需要注意一些问题:
int main()
{FILE* p1 = fopen("data.txt", "w");if (p1 == NULL){perror("fopen");return 1;}fputs("hello world test\n", p1);FILE* p2 = fopen("data.txt", "r");FILE* p3 = fopen("data_copy.txt", "w");if (p2 == NULL && p3 == NULL){perror("fopen");return 1;}int ch = 0;while ((ch = fgetc(p2)) != EOF){fputc(ch, p3);}fclose(p1); //不一样的地方在这里fclose(p2);fclose(p3);p1 = NULL; //这里不一样 p2 = p3 = NULL;return 0;
}
这样就会导致出现这种情况:
拷贝失败的情况。
这是因为:由于咱们系统给文件开了一块缓冲区,然后咱们把写的数据传入进去了,但是系统会等到缓冲区装满之后才会一起送到文件上,否则可能就是等程序结束才会写入文件,而如果咱们提前用fclose关闭文件,就表示对文件的操作已经完成了,系统就会直接写入文件了。
所以我们必须要把目标文件提前搞好,这样才不会导致拷贝失败。
比如先创建这个文件之后再搞:
#include <stdio.h>
//创建data.txt
//int main()
//{
// FILE* p1 = fopen("data.txt", "w");
// if (p1 == NULL)
// {
// perror("fopen");
// return 1;
// }
// fputs("hello world\n", p1);
// fclose(p1);
// p1 = NULL;
// return 0;
//}
//拷贝
int main()
{FILE* p2 = fopen("data.txt", "r");FILE* p3 = fopen("data_copy.txt", "w");if (p2 == NULL && p3 == NULL){perror("fopen");return 1;}int ch = 0;while ((ch = fgetc(p2)) != EOF){fputc(ch, p3);}fclose(p2);fclose(p3);p2 = p3 = NULL;return 0;
}
这样也可以的实现拷贝。
制作不易,求各位大佬三连qwq