C语言中的文件和文件操作

C语言中有一个不常用但也比较重要的内容——文件操作,其中包含许多文件操作相关的函数,今天就浅谈一下。在讲函数之前要先讲一下:文件,数据在文件中的存储,流。

补充:

1.文件分为文本文件和二进制文件,前者就是不加任何加工就可以看懂的文件,后者是要加工把二进制转换才能看懂。

2.字符都是以ASCII值的形式存储的,数字既可以以ASCII值的形式存也可以二进制形式存。举个例子:10000以ASCII值存就占五个字节,而以二进制存占四个字节

3.流:流是抽象出来的,C程序只用向流中读取和写入数据即可。如下图:

C程序中之所以能直接使用scanf和printf函数是因为C程序在启动时会自动打开三个流:1.stdin——标准输入流,一般是从键盘输入,scanf就是从标准输入流中读取数据。2.stdout——标准输出流,一般是从屏幕输出,printf就是向标准输出流中写入数据。3.stderr——标准错误流,一般是到屏幕。

4.每个文件在打开时,会自动开辟一个文件信息区(一个叫FILE的结构体),要用FILE*的文件指针去找他。

弄懂上述的四点,接下来就要将文件操作相关的函数了。

一.文件打开和关闭函数

1.文件打开函数——fopen  FILE * fopen ( const char * filename, const char * mode); 要给该函数传两个参数——函数名和文件打开方式,并用一个FILE*的指针接收它的返回值。打开失败会返回NULL,要检测指针的有效性。具体可查看下方链接   fopen - C++ Reference (cplusplus.com)

注:文件打开方式2.文件关闭函数——fclose    int fclose ( FILE * stream ); 个该函数传文件指针即可,要记得将指针即时赋为NULL,避免野指针。具体看下方链接       fclose - C++ Reference (cplusplus.com)

上述函数使用代码演示:

二.顺序读写函数

1.fgetc和fputc这一对是字符读取和写入函数 int fgetc ( FILE * stream );   int fputc ( int character, FILE * stream );   要给fgetc传一个文件指针,要给fputc传两个参数:字符和文件指针,具体参考fputc - C++ Reference (cplusplus.com) fgetc - C++ Reference (cplusplus.com)

使用代码演示:​​​​​​​

2.fgets和fputs这是一对适用于任何流的文本行读取和写入函数 char * fgets ( char * str, int num, FILE * stream );int fputs ( const char * str, FILE * stream );fgets要给其传三个参数:读取的数据要放的地址,读取的个数(最多读num-1个数据,且只能读一行,当num-1>一行的数据个数时,把\n读上就不会再读了),文件指针。fputs要传两个参数:数据和文件指针。具体参考fgets - C++ Reference (cplusplus.com)   fputs - C++ Reference (cplusplus.com)

使用代码演示:​​​​​​​

3.fscanf和fprintf这是一对适用任何流的格式化读取和写入函数,他们的写法和scanf和printf极其相似,就多了第一个参数——文件指针。具体参考fprintf - C++ Reference (cplusplus.com) fscanf - C++ Reference (cplusplus.com)

使用代码演示:


 

4.fwrite和fread这一对函数是只适用文件流的读取和写入函数size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );  fwrite和fread的参数是一样的:数据的来源或数据读到的位置,元素大小,元素个数,文件指针。会返回读取会写入的有效数据的个数。具体参考fread - C++ Reference (cplusplus.com)   fwrite - C++ Reference (cplusplus.com)

使用代码演示:

 

三.随机读写相关函数

1.fseek会将光标移动到所需要的地方,int fseek ( FILE * stream, long int offset, int origin );需要传三个参数:文件指针,偏移量(可以是负值),起始位置。起始位置可以分为三种SEEK_SET(文件起始位置)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。具体可以参考fseek - C++ Reference (cplusplus.com)

使用代码演示:

 

2.ftell该函数是计算相对起始位置的偏移量  long int ftell ( FILE * stream ); 具体参考ftell - C++ Reference (cplusplus.com)

3.rewind该函数可以将光标移回文件起始位置  void rewind ( FILE * stream );具体参考rewind - C++ Reference (cplusplus.com)

上述两个函数写法不难,就不在这里做演示了。

四.feof和ferror  ferror - C++ Reference (cplusplus.com)  feof - C++ Reference (cplusplus.com)

注:每一个流打开时,都会带有两个标记值,当是因遇到文件末尾而结束时,文件末尾相应的标记值就会被标记,当是因遇到错误而结束时,错误相应的标记值就会被标记。

1.feof是判断文件结束是否是因遇到文件末尾而结束的 , int feof ( FILE * stream );如果检测到文件末尾的标记值被标记,其会返回一个非零的数,反之返回零。

2.ferror是判断文件结束是否是因错误而结束的,int ferror ( FILE * stream );如果检测到错误的标记值被标记,其会返回一个非零的数,反之返回零。

五.文件缓冲区

会在内存中开辟一处文件缓冲区,缓冲区的大小取决于编译器,fclose函数在关闭文件时会将缓冲区中的数据刷新到硬盘内,所以即时关闭很重要,否则可能会导致缓冲区中的数据丢失。

OK,今天的内容就结束了,大家可以运行上述代码,看看结果加深印象,有何不足和错误请及时指出。

 
 

 

                
  • 44
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值