C语言常见文件操作函数总结详解

大家好,我是KookNut39,在CSDN写文,分享一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。最近在更新C/C++方面的知识,感兴趣的欢迎关注博主,可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

好久不见C、C++板块的更新,因为很多新人的需求,今日更新一篇文件操作的文章!

C语言文件操作函数,怕是很多人的痛,因为在各种地方都能用到,说的简单一点在某些课堂作业上,可能会让你去操作一个txt文档的读写,再就是课程设计时候老师要求把数据存放到文本文件中,我曾经见过一个粉丝问我问题,他们的老师要求简直离谱,是必须使用文本文档来存放数据!我直接就🙄🙄🙄,怎么还有这种要求阿?数据库操作也不是不行阿,非得用文本文件,虽说这样比较死板,但也侧面反映出了教学对文件操作的重视,再往深了说,比如你要解析某个文件格式,比如常见的PE文件,关于文件的读写几乎是必不可少的一步,首先得读取到文件内容,才能进行文件的判断和解析吧?所以说了这么多废话,就让我们来看看常用的文件操作函数,这里我只列举常用到的基础操作函数,适合初学者学习!

如果趁着假期想弯道超车,学完文件操作函数,可以试着写一个C语言的某某管理系统来学习一下, 我这里上传了一套程序,是完整版的介绍交易管理系统的实现,纯C语言,感兴趣的小伙伴可以去学习一下,可以直接点击这里,或者在我主页的下载资源里面!

老规矩!一键三连不能少奥兄弟们!!!👀👀👀

1.fopen

fopen是常见的一个文件操作函数,用来打开文件:

FILE *fopen(
   const char *filename,
   const char *mode
);

我们从函数的声明上可以看的出来函数的第一参数是字符串常量的一个文件名字,第二个参数是文件的打开模式,就是我们要以某种方式来访问这个文件。打开文件成功之后,返回一个函数流指针FILE*的这样一个指针类型,如果打开文件失败,返回NULL,关于第二个参数,我们来看一下常见的一些参数:

modeaccess
“r”以只读的方式打开文件,也就是不能修改文件中的内容 ,文件必须存在,如果不存在,打开失败
“w”打开一个空文件进行写入,注意,如果文件存在,那么其中的内容会被清空
“a”在原文件末尾写入文件内容,如果该文件不存在,那么就会创建这个文件
“r+”以读写方式打开文件,文件必须存在,如果不存在,打开失败
“w+”以读写方式打开文件,如果文件中本来有内容,则会被清空
“a+”可以读取文件以及在文件末尾附加,如果文件不存在,则创建新文件
“t”以文本方式打开文件
“b”以二进制形式打开文件

代码示例:

	FILE* File = NULL;//  文件流指针  初始化为NULL
	File = fopen("User.txt", "r");//以只读方式打开文件,并且文件必须存在
	if (File == NULL)
	{
		printf("User数据文件不存在:\n");
		return -1;
	}

2.fread

fopen结束之后,正常情况下我们可以得到一个文件流指针,那么我们需要对这个指针指向的数据进行读操作的时候,就会用到fread函数,这个函数的主要功能就是从一个流中读取数据。

size_t fread(
   void *buffer,
   size_t size,
   size_t count,
   FILE *stream
);

我们可以看到四个参数,第一个参数是需要把读出来数据保存到我们的数据缓冲区中去,这个缓冲区我们自己申请内存或者声明字符数组,第二个参数是按照多大来读取,这里设置的是按照1个字节来读取,第三个参数是我们读取的最大数目,比如我们的第二参数是1个字节,第三参数是8次,那就是读8个字节,如果第二参数是2个字节,那就是最大读取16个字节,第四个参数是我们之前获得的文件流指针。返返回值是一个size_t类型的数据,告诉我们读了的次数,可能小于等于第三参数count。看一个使用的举例:

	char  Signature[8] = { 0 };
	fseek(fh, 0, SEEK_SET);
	int NumberRead = fread(Signature, sizeof(char), 8, fh);

3.fseek

fseek是要将文件指针移动到我们指定的位置上去,因为我们在使用文件指针进行读取操作时候,会造成文件指针的移动,这时候比如我们要去再次读取文件开头的内容,那么文件指针已经移动,我们该如何读取呢,使用fseek将指针移动到我们想让它去到的地方。

int fseek(
   FILE *stream,
   long offset,
   int origin
);

这个函数声明我们可以看到第一个参数是文件流指针,第二个参数是起始字节数,也就是说我们要第三参数origin的相对字节偏移,第三个参数是定位到的初始位置。对于第三参数,有以下三种可能:

origin value意义
SEEK_CUR文件指针的当前位置
SEEK_END文件末尾
SEEK_SET文件开始

下面来看一个简单的例子:

	fseek(File, 0, SEEK_SET);//重置文件指针到初始位置

4.fclose

fclose是用来关闭打开的一个文件流指针,我们对文件操作完毕之后,一定要记得关闭当前的文件流指针,否则可能在后续对该文件再进行操作的时候出现一些错误。

int fclose(
   FILE *stream
);

这个函数看起来很简单的,它就是传入需要关闭的文件流指针,然后关闭成功之后,会返回0。
使用就很简单:

	fclose(File);

5.feof

feof这个函数是用来测试一个流指针是否已经到了文件的末尾,我们有时候需要遍历文件中所有内容时候,就可以用这个函数来进行判断:

int feof(
   FILE *stream
);

这个函数的参数和fclose是一样的,都只需要传入一个文件流指针来进行判断就ok了。如果读取操作试图读取超过文件末尾的内容,则feof函数返回一个非零值;否则返回0。

	while (!feof(File))//判断是否读到文件结尾
	{
		//做一些操作
	}

如果一个文件包含39个字节,而您从文件中读取了39个字节,那么feof将返回0,因为即使文件指针位于文件的末尾,您也没有尝试读取超过末尾的内容。只有当你尝试读取第40个字节时,才会返回一个非零值。

6.fscanf

fscanf和scanf的用法其实是比较相似的,它可以从文件流中把数据读取到我们的buffer缓冲区中来,使用一定的格式限制。

int fscanf(
   FILE *stream,
   const char *format [,
   argument ]...
);

比如下面的这个测试就是用一个正则的限制,每遇到一个逗号,就把文件中的内容读到对应的buffer中去

fscanf(File, "%[^,]%*c %[^,]%*c %[^,]%*c %[^,]%*c %[^,]%*c %[^\n]%*c",
			UserInfo.U_ID,
			UserInfo.U_Name,
			UserInfo.U_PassWord,
			UserInfo.U_PhoneNumber,
			UserInfo.U_Addr,
			Money
		);

fscanf函数从流的当前位置读取数据到参数指定的位置(如果有的话)。每个参数必须是一个指向与格式中类型说明符相对应的类型变量的指针。

7.fprintf

那既然有fscanf,那肯定就得有fprintf啊,不然的话,那不是搞得有点偏心了吗,所以微软也设计了fprintf函数。

int fprintf(
   FILE *stream,
   const char *format [,
   argument ]...
);

这个也是和printf差不多,就是把一个buffer缓冲区的数据,以一个规定的格式输入到文件流中去,比如下面这个例子就是把字符串输入到文件流所指之处去!

	fprintf(File, "%s", BufferData);

8.fgets

fgets是每次从所给流指针中读取一行数据读到缓冲区中去,声明如下:

_ACRTIMP char* __cdecl fgets(
        _Out_writes_z_(_MaxCount) char* _Buffer,
        _In_                      int   _MaxCount,
        _Inout_                   FILE* _Stream
        );

总共三个参数,第一个是一个buffer,到时候需要把数据就读取到这里,第二个是最大的读取字节数,第三个是流指针。具体的使用举例如下:

	fgets(BufferData, 1024, File)

有关文件操作系列的函数呢,常见的我今天想起来的也就是这些了,如果日后再想起来了,再继续在这里更行这篇文章,好久没更新C/C++专栏了,最近确实是比较忙,有想写个完整项目的兄弟,可以去支持一下:https://download.csdn.net/download/qq_42253797/20416914?spm=1001.2014.3001.5503

今日吟诗:“千淘万漉虽辛苦,吹尽狂沙始到金。”

参考:MSDN
在这里插入图片描述

  • 41
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

KookNut39

感谢您请我喝咖啡哈哈哈哈

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

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

打赏作者

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

抵扣说明:

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

余额充值