1. 文件打开方式
打开方式通常有 'r' 'w' 'a' 三种,分别代表 只读,只写,附加。三种操作加 't' 表示以文本文件形式打开,加 'b' 表示以二进制文件形式打开。什么都不加的情况下,默认打开文本文件。
二进制文件和文本文件的区别:
1)在 windows 系统文本文件下,文件以 "\r\n" 代表换行。若以文本模式打开文件,并用 fputs 等函数写入换行符 "\n" 时,函数会自动在 "\n" 前面加上 "\r" 。即实际写入文件的是 "\r\n" 。而二进制文件中换行等同于 "\n" 。
2)在类 Unix/Linux 系统文本文件下,文件以 "\n" 代表换行,故 Linux 系统中在文本文件和二进制文件无区别。
此外,末尾的 '+' 相当于添加功能。例如 r 与 r+ ,r+ 可以写入文件,而不是只读。
![](https://img-blog.csdnimg.cn/20210811130956847.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dsdHpsaWtl,size_16,color_FFFFFF,t_70)
2. 文件打开失败
文件打开失败后,可以利用 perror() 函数直接打印错误信息,也可获取错误码 errno 以及 strerror() 函数对应的错误信息字符串。
#include <stdio.h>
#include <errno.h>
#include <string.h>
void TestFileError(){
FILE *file = fopen("CMakeLists.txt", "r");
if(file){
puts("Open successfully");
fclose(file); // 文件打开后,必须关闭
}else{
printf("error: %d\n", errno); // 获取错误码
puts(strerror(errno)); // 获取错误码对应的提示信息
perror("fopen"); // 打印自带的提示错误信息
}
}
![](https://img-blog.csdnimg.cn/2021081113582734.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dsdHpsaWtl,size_16,color_FFFFFF,t_70)
3. 文件打开成功
文件打开前,需要注意程序执行的工作目录。例如打开项目中的 "CMakeLists.txt",则需要将工作目录进行如下调整:
![](https://img-blog.csdnimg.cn/20210811135031992.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dsdHpsaWtl,size_16,color_FFFFFF,t_70)
文件成功打开的情况下,仍然可能读取时出错,故可利用 ferror() 函数进行判断,如果返回值为 0,说明文件读取无误,否则文件读取失败。此外,判断文件是否读取结束可利用 feof() 函数(eof: end of file)。如果返回值为 0,说明文件读取没有结束,否则文件读取结束。
void TestFileError(){
FILE *file = fopen("CMakeLists.txt", "r");
if(file){
puts("Open successfully");
int err = ferror(file); // 文件读取是否出错
int eof = feof(file); // 文件读取是否结束
printf("err: %d\n", err); // 0,说明没有出错
printf("eof: %d\n", eof); // 0,说明没有结束
fclose(file); // 文件打开后,必须关闭
}else{
perror("fopen"); // 打印自带的提示错误信息
}
}