初学C语言文件操作

试验环境:WIN10 VS2019

本章目的:

让读者了解C语言是如何对文件进行读写操作的,能够使用一些简单的有关文件操作的函数。

文件读和写操作

这里我必须要清楚的交代什么是读和写文件。这一点理解文件的读和写非常重要。

读文件把目标文件中的数据放入要存储的变量中。

写文件把变量中的数据写入目标文件中。

文件指针

百度百科:在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。

文件指针的类型为FILE *

为了能够让读者简单理解这一概念,我这里举个例子。

如果我们要从该文件中读取数据,初始的文件指针是指向a的,如果简单的读取文件数据,我们只能先读取a,然后读取b。如果将文件指针指向f,我们便能从f开始读取数据。(可以简单这么理解)

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

关于fopen:

我们可以用MSDN软件或者www.cplusplus.com查询关于fopen的用法

fopen有两个参数,第一个是要打开文件的文件名,第二个是打开文件的方式

注意:第一个参数不带上文件路径只写文件名的话,默认路径在源文件的目录下。不过我们一般都会带上路径,比如fopen("D:\\data.txt", "r"),并且写路径的时候要用双斜杠。

打开方式如下:

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

 如果不能理解的话,举个简单的例子吧。

int main()
{
	//以只读的方式打开文件
	FILE* pf = fopen("D:\\data.txt", "r");
	if (pf == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

此处就不过于赘述了,如果关于以上代码有问题的话,欢迎与本人交流,谢谢。

关于fclose:

关闭文件,只需将文件指针传入fclose函数中即可。关闭后需将该指针置空,这是一个好习惯

文件操作相关函数

以下基本函数都可以从MSDN或www.cplusplus.com中查询

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件

fread()的使用

 

下图片代表初始文件的内容(二进制文件)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<windows.h>
typedef struct student
{
	char ch[20];
	int age;
	int id;
}stu;
int main()
{
	//打开文件
	FILE* pf = fopen("D:\\data.txt", "rb");
	if (pf == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	//读数据
	stu arr[2] = { 0 };
	fread(arr,sizeof(stu),2,pf);
	printf("%s %d %d", arr[0].ch, arr[0].age, arr[0].id);
	printf("\n%s %d %d", arr[1].ch, arr[1].age, arr[1].id);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果 :

 fwrite()使用

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<windows.h>
typedef struct student
{
	char ch[20];
	int age;
	int id;
}stu;
int main()
{
	//打开文件
	FILE* pf = fopen("D:\\data.txt", "wb");
	if (pf == NULL)
	{
		printf("%s", strerror(errno));
		return 0;
	}
	//写数据
	stu arr[2] = { {"张三",20,2021},{"王五",21,2022}};
	fwrite(arr,sizeof(stu),2,pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

 写入结果:

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
int main()
{
FILE*pf = fopen("test.txt", "w");
fputs("abcdef", pf);//先将代码放在输出缓冲区
Sleep(10000);
fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
//注:fflush 在高版本的VS上不能使用了
fclose(pf);
//注:fclose在关闭文件的时候,也会刷新缓冲区
pf = NULL;
return 0;
} 

//注:fclose在关闭文件的时候,也会刷新缓冲区

这里可以得出一个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件的问题。

总结

对于初学者而言,关于文件操作相关的众多函数不能记住是没关系的,多查MSDN即可。

强烈建议都使用一遍本章提过的文件操作相关的函数。

最后

如果关于本章有什么疑问,欢迎与本人交流。

如果本章出现错误的地方,欢迎指出,本人感激不尽。

如果觉得有收获的话,欢迎点赞和评论,谢谢。

猜你喜欢

转载自blog.csdn.net/m0_62171658/article/details/123077960
今日推荐