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

相关推荐
草莓熊Lotso33 分钟前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
梵刹古音33 分钟前
【C语言】 字符数组相关库函数
c语言·开发语言·算法
2601_949146537 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
学嵌入式的小杨同学7 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
毕设源码-朱学姐8 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
Aaron15888 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
郝亚军8 小时前
如何在Ubuntu和win10/11之间通过samba访问对方的文件
linux·服务器·ubuntu
爱编码的小八嘎9 小时前
C语言对话-21.模板特化,缺省参数和其他一些有趣的事情
c语言
C雨后彩虹9 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
Exquisite.10 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql