【C语言复习】C语言中的文件操作

写在前面

文件操作在C语言部分只是属于了解内容,但是因为它可能会应用在项目中,所以我把它单独写成一个小节。

文件操作

什么是文件

文件的分类

文件一般分为程序文件和数据文件。

  • 程序文件是包括源程序文件(后缀名.c),目标文件(windows环境下后缀名为.obj),可执行程序(windows环境下后缀名为.exe)
  • 数据文件是程序运行过程中需要从中读取数据的文件,或者程序运行中输出内容的文件

本小节文件操作,指的就是数据文件的操作。

根据数据在文件中的组织形式,数据文件又分为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出,就是二进制文件。如果要求在外存上以ASCII码的形式存储,就需要在存储前进行转换。以ASCII字符的形式存储的文件就是文本文件。

一个数据在内存中是怎么存储的呢? 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

文件名

文件名是唯一的文件标识,包含三部分:文件路径,文件名主干,文件名后缀。

文件的操作

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,

使用者不必关心细节。 一般都是通过一个FILE的指针来维护这个FILE结构的变量,使用起来更方便。

//创建FILE*指针变量
FILE* pf;

通过文件指针就可以找到与他相关联的文件。

文件的打开和关闭

文件在读写之前应该先打开,从而打开文件流,建立一个FILE类型的结构体,读写后应该关闭它。

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不关闭,就不会刷新C语言内部的缓冲区,从而导致读写出现问题。

//打开
FILE* fopen(const char* filename, const char* mode);
//关闭
int fclose(FILE* stream);
文件打开mode意义如果指定文件不存在
“r” (只读)为了输入数据,打开一个已经存在的文本文件(输入指的是 文件 -> 内存)出错
“w” (只写)为了输出数据,打开一个文本文件(输出指的是 文件 <- 内存)建立新文件
“a” (追加)文件尾部添加数据建立新文件
“rb” (只读)二进制的r出错
“wb” (只写)二进制的w建立新文件
“ab” (追加)二进制的a出错
“r+” (读写)为了读和写,打开一个文本文件出错
“w+” (读写)为了读和写,建立一个新文件新建
“a+” (读写)打开一个文件,在文件尾部进行读写新建
“rb+”(读写)为了读和写,打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立
“ab+”(读写)打开一个二进制文件,在文件尾部进行读写建立新文件

文件的顺序读写

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

文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针。

可以修改文件指针的位置到任意位置,根据origin来选定文件起始或者是当前位置,根据偏移量修正位置,到任意位置处。

int fseek ( FILE * stream, long int offset, int origin );
ConstantReference position
SEEK_SETBeginning of file
SEEK_CURCurrent position of the file pointer
SEEK_ENDEnd of file *
ftell

前面fseek 是将文件指针移动至任意位置,ftell可以返回文件指针相对于起始位置的偏移量。

long int ftell ( FILE * stream );
rewind

让文件指针的位置回到文件的起始位置。

void rewind ( FILE * stream );
feof

注意,在文件读取过程中,不能用feof 函数的返回值来判断文件是否结束。feof 使用场景是,当文件读取结束的时候,feof 判断是读取失败结束的,还是遇到文件尾部结束的。

所以正确的读取判断文件结束的方法:

  • 文本文件读取是否结束,判断返回值是否为 EOF (对fgetc),或者 NULL (对fgets)
  • 二进制文件的读取结束判断返回值是否小于实际要读取的个数。(fread)

文件操作小节完。主要掌握的还是如何使用文件操作函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值