重要知识点补充
12 文件操作
12.1 C语言中的文件是什么?
12.2 C语言打开文件
12.3 文本文件和二进制文件到底有什么区别?
12.4 以字符形式读写文件
12.5 以字符串的形式读写文件
12.6 以数据块的形式读写文件
12.7 格式化读写文件
12.8 随机读写文件
12.9 C语言实现文件复制功能
12.10 FILE结构体以及缓冲区深入探讨
12.11 获取文件大小(长度)
12.12 插入、删除、更改文件内容
C语言调试 C语言内存精讲 头文件的编写
在C语言中,操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。
打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作。
标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的,可直接使用。 使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为: FILE *fopen(char *filename, char *mode);

filename 为文件名(包括文件路径), mode 为打开方式,它们都是字符串。 fopen() 函数的返回值 fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。
FILE 是 <stdio.h> 头文件中的一个结构体,它专门用来保存文件信息。我们不用关心 FILE 的具体结构,只需要知道它的用法就行。
如果希望接收 fopen() 的返回值,就需要定义一个 FILE 类型的 指针 。例如:
FILE *fp = fopen("demo.txt", "r"); 表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为 文件指针
再来看一个例子: FILE *fp = fopen("D:\\demo.txt","rb+"); 表示以二进制方式打开 D 盘下的 demo.txt 文件,允许读和写。 判断文件是否打开成功 打开文件出错时,fopen() 将返回一个空指针,也就是 NULL,我们可以利用这一点来判断文件是否打开成功,请看下面的代码: FILE *fp; if( (fp=fopen("D:\\demo.txt","rb")) == NULL ){ printf("Fail to open file!\n"); exit(0); //退出程序(结束程序) 我们通过判断 fopen() 的返回值是否和 NULL 相等来判断是否打开失败:如果 fopen() 的返回值为 NULL,那么 fp 的值也为  NULL,此时 if 的判断条件成立,表示文件打开失败。
以上代码是文件操作的规范写法,读者在打开文件时一定要判断文件是否打开成功,因为一旦打开失败,后续操作就都没法进行了,往往以“结束程序”告终。
fopen() 函数的打开方式 不同的操作需要不同的文件权限。例如,只想读取文件中的数据的话,“只读”权限就够了;既想读取又想写入数据的话,“读写”权限就是必须的了。
另外,文件也有不同的类型,按照数据的存储方式可以分为二进制文件和文本文件,它们的操作细节是不同的。
在调用 fopen() 函数时,这些信息都必须提供,称为“文件打开方式”。最基本的文件打开方式有以下几种: 调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为 "t" )。
读写权限和读写方式可以组合使用,但是必须将读写方式放在读写权限的中间或者尾部(换句话说,不能将读写方式放在读写权限的开头)。例如: 将读写方式放在读写权限的末尾:"rb"、"wt"、"ab"、"r+b"、"w+t"、"a+t" 将读写方式放在读写权限的中间:"rb+"、"wt+"、"ab+" 整体来说,文件打开方式由 r、w、a、t、b、+ 六个字符拼成,各字符的含义是: r(read):读 w(write):写 a(append):追加 t(text):文本文件 b(binary):二进制文件 +:读和写 文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为: int fclose(FILE *fp); fp 为文件指针。例如: fclose(fp); 文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。
最后,我们通过一段完整的代码来演示 fopen 函数的用法,这个例子会一行一行地读取文本文件的所有内容: #include <stdio.h> #include <stdlib.h> #define N 100 int main() { FILE *fp; char str[N + 1]; //判断文件是否打开失败 if ( (fp = fopen("d:\\demo.txt", "rt")) == NULL ) { puts("Fail to open file!"); exit(0); //循环读取文件的每一行数据 while( fgets(str, N, fp) != NULL ) { printf("%s", str); //操作结束后关闭文件 fclose(fp); return 0; 读者只需要关心文件打开部分的代码,暂时不用关心文件读取部分的代码,后续我们会逐一讲解。

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。本公众号由 C语言中文网站长 亲自运营,长期更新,坚持原创。

微信扫码关注公众号