一、打开关闭文件
1. 打开文件
#include <stdio.h>
FILE *fopen(const char *filepath, const char *mode);
字符串 filepath 表示文件路径,可以是相对路径或绝对路径。字符串 mode 是访问模式,其值可以是下列情况:
- r :以只读模式打开一个已有的文本文件,从文件头开始读取。
- w :以只写的模式打开一个文本文件,从文件头开始写入。如果文件不存在,则创建新文件。写入会覆盖文件全部内容。
- a :以追加的模式打开一个文本文件,从文件末尾追加内容。如果文件不存在,则创建新文件。
- r+ :以读和写的模式打开一个已有的文本文件,从文件头开始读取和写入。覆盖写入位置的内容,其他位置内容保留。
- w+ :以读和写的模式打开一个文本文件,从文件头开始读取和写入。如果文件不存在,则创建新文件。写入会覆盖文件全部内容。
- a+ :以读和追加的模式打开一个文本文件,从文件末尾追加内容。如果文件不存在,则创建新文件。
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
如果打开文件成功该方法会返回一个指向 FILE 结构的指针,如果失败则返回 NULL 并设置 errno 错误。
2. 关闭文件
#include <stdio.h>
int fclose(FILE *fp);
用于关闭先前由 fopen 函数打开的文件。如果成功关闭文件,fclose( ) 函数返回 0,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。注意文件操作完成后应及时关闭文件。
3. 示例
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* 定义一个指向文件类型的指针 */
FILE *fp;
int ch;
/* 以只读模式打开本地 hello.txt 文件 */
fp = fopen("./hello.txt", "r");
if (fp == NULL) {
printf("文件打开失败!");
exit(EXIT_FAILURE);
}
/* 循环从文件中读取一个字符 */
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
putchar('\n');
/* 关闭文件 */
fclose(fp);
return 0;
}
二、文件指示器
#include <stdio.h>
int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
- feof() 用于检测文件的末尾指示器是否被设置。返回一个非 0 值;如果检测不到末尾指示器被设置,返回值为 0。
- ferror() 用于检测文件的错误指示器是否被设置。返回一个非 0 值;如果检测不到错误指示器被设置,返回值为 0。
- clearerr() 用于清除指定文件的末尾指示器和错误指示器。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int ch;
/* 以只读模式打开文件 */
if ((fp = fopen("./hello1.txt", "r")) == NULL) {
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
while (1) {
ch = fgetc(fp);
/* 判断读取文件时是否存在错误 */
if (ferror(fp)) {
printf("读取文件时出错...\n");
break;
}
/* 如果读取到文件末尾,就结束读取 */
if (feof(fp)) {
break;
}
putchar(ch);
}
/* 清理错误指示器与末尾指示器 */
clearerr(fp);
/* 关闭文件 */
fclose(fp);
return 0;
}
三、错误信息
在发生错误时,大多数的函数调用会返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误。我们可以在 errno.h 头文件中找到各种各样的错误代码。
C 语言提供了 perror() 和 strerror() 函数来显示与 errno 相关的文本消息。
- perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。
- strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main()
{
FILE *pf;
int errnum;
pf = fopen("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
/* 输出错误号到标准错误输出 */
fprintf(stderr, "错误号: %d\n", errnum);
/* 获取错误号的文本说明 */
fprintf(stderr, "错误信息: %s\n", strerror(errnum));
/* 使用 perror 打印错误信息 */
perror("通过 perror 输出错误");
/* 设置退出状态为 EXIT_FAILURE */
exit(EXIT_FAILURE);
}
/* 关闭文件 */
fclose(pf);
return 0;
}
通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS(值为 0 的宏)。而如果存在错误的情况,当您退出程序时,会带有状态值 EXIT_FAILURE(值为 -1 的宏)。
我们还可以使用重定向将错误信息打印到指定为文件:
# 将标准错误输出重定向到指定文件
$ gcc test.c && ./a.out 2> error.log