正常我们的程序在执行的时候程序结束后,会将所有数据清楚,那么我们应该如何保存数据呢?这里我们就需要用文件操作。
一、文件的打开和关闭
1.文件打开、关闭函数—fopen、fclose
//打开文件
FILE * pf = fopen ( const char * filename, const char * mode );
//关闭文件
fclose ( pf);
FILE是C语言提供的文件类型,是一个结构体类型。FILE*是文件指针类型,通过该指针可以对文件进行一系列的操作。
fopen第一个参数是打开的文件名,可以指输入该文件名,也可以输入文件的绝对路径。如c:\code\test.txt.
fopen第二个参数mode为打开文件的方式,常见的有下面的几种类型:

在对文件进行相关操作后应该及时使用fclose函数进行关闭,以便及时释放资源。
若fopen打开文件失败,则返回空指针,因此打开文件后应该做必要的判断。对于fclose,如果成功返回值为0,否则返回EOF。
二、常见的文件操作函数
字符输入函数-fgetc
fgetc函数返回文件指针指向的字符,并使指针向下一个字符偏移。若想用此函数打印文件全部内容,可用while((ch=fgetc(pf))!=EOF)循环来控制,这是因为当指针指向文件结尾,函数返回值为-1。

字符输出函数-fput
由于要输出数据,故文件打开方式为"w",此时如图将字符c输出到了文件内。

mode的一些注意事项:
用“r”的方式打开文件,若文件不存在,则会返回一个空指针;若用“w”或“a”打开文件,若没有该文件则会创建一个文件,进行操作,当文件存在的时候,写入也会把原来的内容覆盖掉。
字符串输入函数-fgets

fgets需要三个参数,第一个输出字符串,第二个是输出的字符串长度,第三个操作文件地址。

为何只打印了四个字符呢?因为fgets会在末尾添加一个“\0”作为结束标志。
字符串输出函数-fputs

fputs只包含两个参数,第一个输出的字符串,第二个操作的文件地址。

二进制输入函数-fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size -- 这是要读取的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流
二进制输出函数-fwrite

fwrite fread是成块的对二进制文件进行读写,如以二进方式处理文件,文件里的内容除了字符型以asc码显示的你能用记事本打开时能看明白,其它数值类型都是按其在内存里的二进制格式存储的,以asc码的形式强制解释,就全是乱码。
格式化输入函数-fscanf

将文件内容以格式化输入的方式赋值给变量,再进行打印。
顺便一提sscanf函数,它是将字符串内容以格式化方式输出,其第一个参数是指向字符数组的指针 。
8.格式化输入函数-fprintf

基本与printf函数参数相同,只是多了一个文件类型指针的参数,能以格式化输出的方式将内容输出到文件内。
顺便提一下sprintf()函数。fprintf函数能将数据内容向所有输出流输出,而sprintf函数便是将数据内容保存为字符串,其第一个参数是指向字符数组的指针。
三、文件位置指针操作函数
返回指针偏移量函数-ftell

以"r"的方式打开文件,位置指针初始时在文首,偏移量为0,而每进行一次字符读写,偏移量便加一。 ftell函数能反映当前文件位置指针的位置。
返回指针原点函数-rewind

使用rewind后,文件指针的起始位置变成了原点0的位置。
定位文件指针函数-fseek

参数一文件类型指针,参数二指针偏移量,参数三初始偏移位置,包括SEEK_SET为文件开头位置,SEEK——CUR为当前位置指针的位置,SEEK_END则为文件结尾位置。
四、文件缓冲区
文件是指存储在外部存储介质上的、由文件名标识的一组相关信息的集合。由于CPU 与 I/O 设备间速度不匹配。为了缓和 CPU 与 I/O 设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。使用文件缓冲区可减少读取硬盘的次数。