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

相关推荐
悟能不能悟17 小时前
java的java.sql.Date和java.util.Date的区别,应该怎么使用
java·开发语言
高山上有一只小老虎18 小时前
java 正则表达式大全
java·正则表达式
躲猫猫的喵喵18 小时前
Ubuntu2204降内核版本
linux·运维·服务器·ubuntu
_院长大人_18 小时前
设计模式-工厂模式
java·开发语言·设计模式
凌波粒19 小时前
MyBatis完整教程IDEA版(2)--ResultMap/注解/一对多/多对一/lombok/log4j
java·intellij-idea·mybatis
蓝-萧19 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key19 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
cccccc语言我来了19 小时前
(Linux (6):从包管理到工具探索,构建系统操作基础认知)
linux·运维·服务器
ben9518chen20 小时前
嵌入式Linux C语言程序设计九
linux·c语言
wuk99820 小时前
CentOS7环境搭建L2TP服务器
运维·服务器