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

相关推荐
NE_STOP10 小时前
MyBatis-配置文件解读及MyBatis为何不用编写Mapper接口的实现类
java
后端AI实验室15 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风17 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme17 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better17 小时前
学会与虚拟机对话---ASM
java
开源之眼19 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori31620 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户9083246027321 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋21 小时前
DecimalFormat 与 BigDecimal
java·后端
beata21 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端