一.文件的先关知识
1.1 什么是文件?
磁盘上的文件是文件,在程序设计的时候,我们一般将文件分为两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类 的)。
程序文件是什么?
程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows 环境后缀为.exe)。
数据文件是什么?
⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
1.2文件名
⼀个⽂件要有⼀个唯⼀的⽂件标识,以便⽤⼾识别和引⽤。
⽂件名包含3部分:⽂件路径+⽂件名主⼲+⽂件后缀
例如: c:\code\test.txt 为了⽅便起⻅,⽂件标识常被称为⽂件名
1.3流(stream)
那么什么是流呢?
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出 操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。 C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。
文件流是通过文件指针来实现的,文件指针负责跟踪文件的当前位置,而文件流则提供了一种方便的方式来读取和写入文件。
标准流
• stdin-标准输⼊流
• stdout-标准输出流
• stderr-标准错误流
这是默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进⾏输⼊输出操作的。
1.4文件缓冲区
从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
因为有缓冲区的存在,C语⾔在操作⽂件的时候,需要做刷新缓冲区或者在⽂件操作结束的时候关闭⽂ 件。 如果不做,可能导致读写⽂件的问题。
1.5文件指针
缓冲⽂件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE.
在不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异。
我们可以创建一个文件指针变量
FILE* pf;//⽂件指针变量
定义pf是⼀个指向FILE类型数据的指针变量。可以使pf指向某个⽂件的⽂件信息区(是⼀个结构体变 量)。通过该⽂件信息区中的信息就能够访问该⽂件。总之 通过文件指针变量能够间接找到与它关联的文件。
二.文件的打开与关闭
2.1文件的打开
在ANSIC规定使⽤中 fopen 函数用来打开⽂件
FILE * fopen ( const char * filename, const char * mode );// 打开⽂件
mode文件打开的模式
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只写) | 为了输⼊数据,打开⼀个已经存在的文本⽂件 | 出错 |
“w”(只写) | 为了输出数据,打开⼀个⽂本⽂件 | 重新建立一个文件夹 |
“a”(追加) | 向⽂本⽂件尾添加数据 | 建⽴⼀个新的⽂件 |
“rb”(只读) | 为了输⼊数据,打开⼀个⼆进制⽂件 | 出错 |
“wb”(只写) | 为了输出数据,打开⼀个⼆进制⽂件 | 建⽴⼀个新的⽂件 |
“ab”(追加) | 向⼀个⼆进制⽂件尾添加数据 | 建⽴⼀个新的⽂件 |
“r+”(读写) | 为了读和写,打开⼀个⽂本⽂件 | 出错 |
“w+”(读写) | 为了读和写,建议⼀个新的⽂件 | 建⽴⼀个新的⽂件 |
“a+”(读写) | 打开⼀个⽂件,在⽂件尾进⾏读写 | 建⽴⼀个新的⽂件 |
“rb+”(读写) | 为了读和写打开⼀个⼆进制⽂件 | 出错 |
“wb+”(读 写) | 为了读和写,新建⼀个新的⼆进制⽂件 | 建⽴⼀个新的⽂件 |
“ab+”(读 写) | 打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写 | 建⽴⼀个新的⽂件 |
2.2文件的关闭
int fclose ( FILE * stream );// 关闭⽂件
只要有文件的打开的同时,必定有文件的关闭,这两者是同时存在的
三.文件的顺序读写
3.1顺序读写函数的介绍
函数名 | 功能 | 适用于 |
---|---|---|
fgetc | 字符输⼊函数 | 所有输⼊流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | 文本行输入函数 | 所有输⼊流 |
fputs | 文本行输出函数 | 所有输出流 |
fscanf | 格式化输⼊函数 | 所有输⼊流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
上⾯表格说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流一般指适⽤于标准输出流和其他输出流(如⽂件输出流)。
fgetc和fputc
fgetc是从流中获取字符(Fgetc和getc是等价的,除了getc可以在某些库中作为宏实现。)
fputs则是将一个字符写入流并推进位置指示器。
fgets和fputs
fgets从流中获取字符串并将其作为C字符串存储到str中,直到读取(num-1)个字符,或者到达换行符或文件结束符,以先发生的为准。(注意,fgets与gets有很大的不同:fgets不仅接受流参数,而且允许指定str的最大长度,并在字符串中包含任何结束换行符。)
fputs将字符串写入流函数从指定的地址(str)开始复制,直到到达结束的空字符('\0')。这个终止的空字符不会复制到流中。(注意,fputs与puts的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而puts会自动在末尾附加一个换行符。)
fscanf和fprintf
将这两个函数之间类型和scanf以及printf进行比较:可以发现都是多了FILE*stream,多了一个流,需要通过流来实现前两个函数的作用
fread和fwrite
fread从流中读取数据块 ptr指读取内存块的位置 size指每个元素的大小(大小为字节)count指需要读取的数量 stream指指向FILE对象的指针,其中包含要读取数据的文件。
fwrite将数据块写入流 ptr指写入内存块的位置 size指每个元素的大小(大小为字节)count指需要写入的数量 stream指指向FILE对象的指针,其中包含要写入数据的文件。
以上就是顺序读写函数的介绍,如有错误各位大佬评论区指出
四.文件的随机读写
4.1fseek
根据文件指针的位置和偏移量来定位文件指针
重新定位流位置指示器
将与流关联的位置指示器设置为新位置。
4.2ftell
返回文件指针相对于起始位置的偏移量
获取流中的当前位置
返回流的位置指示器的当前值。
4.3rewind
让⽂件指针的位置回到文件的起始位置
设置流的起始位置
将与流关联的位置指示器设置为文件的开头。
五.文件读取的判定
5.1被错误使⽤的 feof
牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
1.⽂本⽂件读取是否结束,判断返回值是否为EOF ( fgetc ),或者NULL (fgets)
例如: • fgetc 判断是否为 EOF .
• fgets 判断返回值是否为 NULL
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。
例如:
• fread判断返回值是否⼩于实际要读的个数。
标签:文件,函数,输出,读写,C语言,FILE,操作,指针 From: https://blog.csdn.net/ZWW_zhangww/article/details/139395363