C语言——程序拷贝文件

问题如下:

写一个程序拷贝文件:

使用所学文件操作,在当前目录下放一个文件data.txt,写一个程序,将data.txt文件拷贝一份,生成data_copy.txt文件。

基本思路:

  1. 打开文件data.txt,读取数据
  2. 打开文件data_copy.txt,写数据
  3. 从data.txt中读取数据存放到data_copy.txt文件中,直到文件结束。
  4. 关闭两个文件

所以我们需要的函数有 fopen()(用来打开文件),fputs()(文本行输出,写一个字符串),fclose()(用来关闭文件),fgetc()(读文件,读一个字符),fputc()(字符输出,写进一个字符)。

函数实现如下:

cpp 复制代码
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;
}

我们查看文件

可以看到,我们成功拷贝了。

但是我们需要注意一些问题:

cpp 复制代码
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关闭文件,就表示对文件的操作已经完成了,系统就会直接写入文件了。

所以我们必须要把目标文件提前搞好,这样才不会导致拷贝失败。

比如先创建这个文件之后再搞:

cpp 复制代码
#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

相关推荐
gadiaola26 分钟前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
Zfox_29 分钟前
Redis:Hash数据类型
服务器·数据库·redis·缓存·微服务·哈希算法
coderSong25683 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy4 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
apocelipes4 小时前
Linux c 运行时获取动态库所在路径
linux·c语言·linux编程
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
ABB自动化5 小时前
for AC500 PLCs 3ADR025003M9903的安全说明
服务器·安全·机器人
努力学习的小廉5 小时前
深入了解linux系统—— 进程池
linux·运维·服务器
年老体衰按不动键盘5 小时前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖5 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存