引言:
在文件操作中,EOF 是 “End of File”(文件结束)的缩写,用于指示文件的结束。EOF 是一个特殊的整型值(int),当文件指针到达文件末尾时,许多文件操作函数会返回这个值。
1. feof 函数
feof 函数用于检查文件指针是否到达文件的末尾。它常与循环结合使用,以确保在读取文件时处理文件结束的情况。
示例
FILE *fp = fopen("example.txt", "r"); // 打开文件
if (fp == NULL)
{perror("打开文件时发生错误"); // 如果文件打开失败,打印错误信息return -1; // 返回错误代码
}char buffer[100];
while (fgets(buffer, 100, fp) != NULL)
{ // 逐行读取文件内容printf("%s", buffer); // 打印读取的内容
}if (feof(fp))
{ // 检查是否到达文件末尾printf("已经到达文件末尾。\n");
}
else
{printf("在到达文件末尾之前发生错误。\n");
}fclose(fp); // 关闭文件
2. fgetc 函数和 EOF
fgetc 函数用于从文件中读取一个字符。当到达文件末尾时,fgetc 会返回 EOF,这通常用于结束读取循环。
示例
FILE *fp = fopen("example.txt", "r"); // 打开文件
if (fp == NULL)
{perror("打开文件时发生错误"); // 如果文件打开失败,打印错误信息return -1; // 返回错误代码
}int ch;
while ((ch = fgetc(fp)) != EOF)
{ // 逐个字符读取文件内容,直到到达文件末尾putchar(ch); // 打印读取的字符
}fclose(fp); // 关闭文件
3. fscanf 函数和 EOF
fscanf 函数用于从文件中读取格式化输入。当读取操作到达文件末尾时,fscanf 会返回 EOF,这可用于判断读取是否完成。
示例
FILE *fp = fopen("example.txt", "r"); // 打开文件
if (fp == NULL)
{perror("打开文件时发生错误"); // 如果文件打开失败,打印错误信息return -1; // 返回错误代码
}int num;
while (fscanf(fp, "%d", &num) != EOF)
{ // 按格式读取文件内容,直到到达文件末尾printf("读取的数字: %d\n", num); // 打印读取的数字
}fclose(fp); // 关闭文件
4. fgets 函数和 EOF
fgets 函数用于从文件中读取一行字符串。当读取操作到达文件末尾时,fgets 会返回 NULL,这可以用于判断文件读取是否结束。
示例
FILE *fp = fopen("example.txt", "r"); // 打开文件
if (fp == NULL)
{perror("打开文件时发生错误"); // 如果文件打开失败,打印错误信息return -1; // 返回错误代码
}char buffer[100];
while (fgets(buffer, 100, fp) != NULL)
{ // 逐行读取文件内容,直到到达文件末尾printf("%s", buffer); // 打印读取的内容
}fclose(fp); // 关闭文件
5. 错误处理与 EOF
在读取文件时,可能会遇到错误。使用 feof 和 ferror 函数可以分别检测文件是否到达末尾以及是否发生读取错误。
示例
FILE *fp = fopen("example.txt", "r"); // 打开文件
if (fp == NULL)
{perror("打开文件时发生错误"); // 如果文件打开失败,打印错误信息return -1; // 返回错误代码
}char buffer[100];
while (fgets(buffer, 100, fp) != NULL)
{ // 逐行读取文件内容printf("%s", buffer); // 打印读取的内容
}if (feof(fp))
{ // 检查是否到达文件末尾printf("已经到达文件末尾。\n");
}
else if (ferror(fp))
{ // 检查是否发生读取错误printf("读取文件时发生错误。\n");
}fclose(fp); // 关闭文件