绪论
书接上回,上章的动态内存管理,通过过几个函数来对内存的堆栈开辟一定的空间进行使用,但始终还是借操作系统的内存最终还是要还回去的(当程序结束后),而本章将讲到C语言如何操作文件就是来进行持久化的保存所创建的数据,并且我还会通过学生信息管理系统来进行实操。
话不多说安全带系好,发车啦(建议电脑观看)。
思维导图:
要XMind思维导图的话可以私信哈
目录
1.为什么要使用文件
2.什么文件
2.1程序文件:
2.2.数据文件:
2.3文件名
3.文件的打开和关闭
3.1文件指针
3.2打开文件、关闭文件的函数
3.2.1fopen(打开文件函数):
3.2.2fclose(关闭打开的文件):
4.文件的顺序读取
4.1顺序读取函数
4.1.1.fgetc、fputc
4.1.2.fgets、fputs
4.1.3.fprintf、fscanf
4.1.4.fread、fwrite
4.2sscanf、sprintf
5.文件的随机读写
5.1fseek
5.2ftell
5.3.rewind
6.文本文件和二进制文件
7.文件读取结束的判定
7.1.feof函数
8.文件缓冲区
1.为什么要使用文件
使用文件时可以持久化的将数据存储起来,也就可以在程序结束后的下一次运行时调用他(其存放在硬盘上(文件、数据库),不像内存中的数据会自动销毁)
2.什么文件
在磁盘中的文件其实都是文件只是类型不相同
而在我们程序设计中一般关注两种文件:
2.1程序文件:
一般来说是源文件(后缀为.c文件)、目标文件(后缀为.obj)、可执行程序(后缀为.exe)但在程序文件内的所有文件也都可称为程序文件
2.2.数据文件:
在一个程序中当我们读取某些文件的数据或者对某些文件进行修改,这些输入(读取)/ 输出(修改)的文件就被称为数据文件
2.3文件名
知识点:
文件名(文件标识)是由:文件路径 + 文件主干 + 文件后缀 组成
如上这个文件其名是:C:\code\代码仓库\双向循环列表\双向循环列表\test.c
直接写出文件名的路径叫绝对路径 : "C:\\code\\代码仓库\\文件操作章\\文件操作章\\test.txt"
注意双杠
不过一般只用test.c(直接写 主干+后缀 的数据文件这种路径叫做相对路径 : "test.txt")
假如文件在程序文件上一级则可以在相对路径前+" ../ " : "../test.txt" 以此类推,几个就向上找几级
本章节主要讨论的就主要是数据文件,我们应该如何在程序中进行文件的读取和改写。
对于向scanf、printf这类都属于终端型(标准输入输出流)的,而本章是将数据写到文件中去的。
3.文件的打开和关闭
3.1文件指针
知识点:
对于每个文件来说每当我们在程序中打开一个文件时都会开辟一个文件信息区(存放文件的信息),而在C语言的内存中每当我们用函数打开一个文件时就会创建一个结构体来存储这个文件而这个文件的信息就存在文件信息区,并且该结构体的类型的系统声明成为FILE,所以一般都是直接通过FILE * 指针来控制(维护)
对于文件信息区可以大概的看成上图,并且结构体中的内容我们可以暂不关心(因为在不同的编译器下FILE结构体中的成员是不一样的,但大同小异)。
3.2打开文件、关闭文件的函数
知识点:
3.2.1fopen(打开文件函数):
FILE * fopen ( const char * filename, const char * mode );
filename:文件名
mode:打开方式
"r":读
"w":写
"a":追加
"r+":读/刷新
.....
返回类型是一个FILE * 的指针,因当打开一个文件时他就会在文件中创建一个文件信息区(打开文件名的信息),所以要把文件信息区的地址返回来(为了方便我们使用信息),所以同时需要一个相同类型的指针来接收如其地址 FLIE* pf = fopen(test.txt,"r");
并且当打开失败时,会返回一个NULL,所以像动态内存申请空间一样要加上一个判断来判断是否打开成功
3.2.2fclose(关闭打开的文件):
int fclose ( FILE * stream );
stream:是已经打开了的信息区,我们将其地址传过去即可关闭:(fclose(pf));
若关闭成功会返回0,关闭失败则会返回EOF
fopen 和 fclose 的头文件都是#include<stdio.h>
用代码来大概展示一下如何打开和关闭文件:
int main() { //FILE * pf = fopen("C:\\code\\代码仓库\\文件操作章\\文件操作章\\test.txt","r");//绝对路径 FILE * pf = fopen( "test.txt","r");//相对路径 if(pf == NULL)//防止开辟失败,访问NULL { perror("fopen"); return 1; } //使用文件 此处省略 //关闭文件 fclose(pf); pf = NULL; return 0; }
细节:
文件的打开方式:
文件使用方式 | 含义 | 如果指定文件不存在 |
"r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w" (只写) | 为了输出数据,打开一个文本文件 | 创建一个新的文件 |
"a"(追加) | 向文本文尾添加数据 | 创建一个新的文件 |
"rb"(只读) | 为输入数据,打开一个二进制文件 | 出错 |
"wb" (只写) | 为输出数据,打开一个二进制文件 | 创建一个新的文件 |
"ab"(追加) | 向一个二进制文件尾添加数据 | 出错 |
"r+"(读写) | 为了读和写,打开一个文件文本 | 出错 |
"w+" (读写) | 为了读和写,打开一个新的文件 | 创建一个新的文件 |
"a+"(读写) | 打开一个文件,在文件尾进行读写 | 创建一个新的文件 |
"rb+"(读写) | 为了读和写打开一个二进制文件 | 出错 |
"wb+" (读写) | 为了读和写,新 建一个二进制文件 | 创建一个新的文件 |
"ab+"(读写) |
打开一个二进制文件,在文件尾进行读和写 | 创建一个新的文件 |