C语言——文件操作相关

1. 打开和关闭文件

对一个文件进行读写后必须对将其关闭。

下面列举所有可使用的打开模式:

模式 描述
“r” 1. 以只读的模式打开一个文本文件,从文件头开始读取
2. 该文本文件必须存在
“w” 1. 以只写的模式打开一个文本文件,从文件头开始写入
2. 如果文件不存在则创建一个新的文件
3. 如果文件已存在则将文件的长度截断为 0 (重新写入的内容将覆盖原有的所有内容)
“a” 1. 以追加的模式打开一个文本文件,从文件末尾追加内容
2. 如果文件不存在则创建一个新的文件
“r+” 1. 以读和写的模式打开一个文本文件,从文件头开始读取和写入
2. 该文件必须存在
3. 该模式不会将文件的长度截断为 0 (只覆盖重新写入的内容,原有的其他内容保留)
“w+” 1. 以读和写的模式打开一个文本文件,从文件头开始读取和写入
2. 如果文件不存在则创建一个新的文件
3. 如果文件已存在则将文件的长度截断为 0 (重新写入的内容将覆盖原有的所有内容)
“a+” 1. 以读和追加的模式打开一个文本文件
2. 如果文件不存在则创建一个新的文件
3. 读取是从文件头开始,而写入则是在文件末尾追加
“b” 1. 与上面 6 种模式均可结合(“rb”, “wb”, “ab”, “r+b”, “w+b”, “a+b”)
2. 其描述的含义一样,只不过操作的对象二进制文件

打开方式要区分文本模式和二进制模式的原因,主要是因为换行符的问题。C 语言用 \n 表示换行符,Unix 系统用 \n ,Windows 系统用 \r\n ,Mac 系统则用 \r。如果在 Windows 系统上以文本模式打开一个文件,从文件读到的 \r\n 将会目动转换成 \n,而写入文件则将 \n 替换为 \r\n 。但如果以二进制模式打开则不会做这样的转换。Unix 系统的换行符跟 C 模式是一致的,所以不管以文本模式打开还是二进制模式打开,结果都是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>

int main(void) {
FILE *fp;
int ch;

if ((fp = fopen("hello.txt", "r")) == NULL) {
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}

while ((ch = getc(fp)) != EOF) {
putchar(ch);
}
fclose(fp); // 关闭文件后指针失效

return 0;
}

首先在该文件夹下创建一个 hello.txt ,然后运行程序。

文件读写需要通过一个缓冲区,读写之后一定要关闭文件,才能将缓冲区中的数据读入。关闭后文件指针自动失效。

2. 读写文件

fgetc fgets

fputc fputs

fseek

等等一系列文件操作函数,用到再看吧。

3. 标准流和错误处理

  1. 可以通过多种方式做错误提示,方便代码调试。
  2. I/O 设备也可以通过相关函数控制。

以上部分内容暂时没怎么用到,学了忘得也快,快速过了一遍有个印象,等用到了再回过头来整理。