初学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即可。

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

最后

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

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

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

  • 59
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李逢溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值