✨✨欢迎大家来到Celia的博客✨✨
创作不易,请点赞关注,多多支持哦
所属专栏:C语言
个人主页:Celia's blog~
目录
引言
一、二进制文件与文本文件
二、文件的打开与关闭
2.1 流和标准流
2.1.1 流
2.1.2 标准流
2.2 文件指针
2.3 文件的打开与关闭
三、文件的顺序读写
3.1 fgetc
3.2 fputc
3.3 fgets
3.4 fputs
3.5 fprintf
3.6 fscanf
3.7 fwrite
3.8 fread
四、文件的随机读写
4.1 fseek
4.2 ftell
4.3 rewind
五、文件读取结束的判定
5.1 feof
5.2 常见判断文件读取结束的方法
六、文件缓冲区
我们知道,C语言程序是储存在电脑的内存中的,如果程序退出,内存会被回收,保存在变量中的数据就会被删除,如果我们想把程序运行时产生的数据永久性的保存(存储到在磁盘上),就会用到有关文件的操作,本篇文章将会介绍C语言中有关文件操作的内容。
根据数据的组成形式,分为二进制文件和文本文件。
- 数据在内存中以二进制的形式存储,如果不加以转换,直接输出到外部的文件内,就是二进制文件。
- 如果数据要求以ASCII码的形式存储,在存储之前就需要转换,以ASCII字符存储的文件就是文本文件。
以上是数据存入文件的两种方式。那么一个数据中的内容如何区分用哪种方式存储呢?
字符数据一律以ASCII码形式存储,数值型数据既可以用二进制存储,也可以用ASCII码存储。
如:数值为 10 的数据,用二进制存储为 1010(此处省略高位0),用字符存储为 ‘1’,‘0’。(2个字符)。
我们的程序需要输出数据到外部设备,也需要从外部设备输入数据,不同的外部设备输入输出的操作和处理方式各不相同。为了方便对内外部数据的操作,C语言抽象出“流”的概念,把流想象成一条充满数据的河,外部数据可以通过流输入数据,内部数据也可以通过流输出数据。
C语言对文件,键盘,屏幕的输出、输入数据的操作都需要通过流来完成。一般情况下,我们想要向流里输入数据或者从流里读取数据,都需要先打开流,然后操作。
为什么我们在编写程序输入输出数据时,没有手动写出打开流的代码呢?
那是因为在C语言程序在启动的时候,默认打开了3个流:
- stdin —— 标准输入流,在大多数情况下从键盘输入,scanf就是向流中输入数据。
- stdout —— 标准输出流,大多数情况下输出到显示屏界面,printf就是在流中读取数据。
- stderr —— 标准错误流,大多数情况下输出到显示屏界面。
这三个流的类型是 FILE* ,通常称为文件指针,C语言就是通过文件指针对文件进行操作的。
当我们使用文件时,每个文件都会在内存中开辟一块相应的文件信息区,所有对文件操作所需要的信息会自动填充到这个文件信息区内,并用一个结构体变量来保存。同时系统将这个结构体重命名为 FILE。
以下是VS2013编译环境提供的 stdio.h 头文件中对于文件类型申明:
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;//重命名为FILE
不同的编译环境对于文件类型的申明有可能不同,但大致上是相同的。
每当我们打开一个文件时,系统会自动创建一个 FILE 结构的变量并自动填充相关的信息,一般情况下,对于文件的操作都是通过创建一个 FILE* 的指针来维护这个结构体变量。
创建一个文件指针:
FILE* pf;//创建一个文件指针变量pf
pf 实际上指向的是一个文件的信息区(一个结构体变量),通过文件信息区就可以访问这个文件,也就是说,通过文件指针能够间接的找到与它相关联的文件。
我们在读写文件之前需要先打开文件,在使用后关闭文件。
在打开一个文件时,相应的函数会返回一个文件指针(FILE*)指向该文件。
ANSI C 规定使用 fopen 来打开文件,fclose 来关闭文件。
#include
int main()
{
//打开文件
FILE* pf = fopen(const char*_FileName,const char*_Mode);
//相应操作
//关闭文件
fclose(pf);
return 0;
}
在这其中,FileName代表文件名,Mode代表文件的打开模式: