使用 C 语言中的 feof 函数

Jinku Hu 2023年10月12日
  1. 使用 feof 函数检查 C 语言中文件流上的文件结束指示符
  2. 在 C 语言中使用 feofferror 函数来测试文件流的有效位置
使用 C 语言中的 feof 函数

本文将介绍几种在 C 语言中使用 feof 函数的方法。

使用 feof 函数检查 C 语言中文件流上的文件结束指示符

feof 函数是 C 标准输入/输出库的一部分,定义在 <stdio.h> 头文件。feof 函数检查给定文件流上的文件结束指示器,如果 EOF 被设置,则返回一个非零整数。它把 FILE 指针作为唯一的参数。

在下面的例子中,我们演示了当使用 getline 函数逐行读取文件时,该函数会被调用,直到 feof 返回零,意味着文件流还没有到达 EOF。注意,我们在条件语句中验证 getline 函数的返回值,只有在成功的情况下才调用 printf 输出读行。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  FILE* in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* contents = NULL;
  size_t len = 0;

  while (!feof(in_file)) {
    if (getline(&contents, &len, in_file) != -1) {
      printf("%s", contents);
    }
  }

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

在 C 语言中使用 feofferror 函数来测试文件流的有效位置

另外,在我们读取文件内容之前,可以利用 feof 来测试文件流的位置。在这种情况下,我们使用 fread 调用读取文件,它使用 stat 函数调用检索文件的大小。注意,存储读取字节的缓冲区是使用 malloc 函数在堆上分配的。另外,我们在条件语句中加入了 ferror 函数,与 EOF 指示符一起测试文件流上的 error 状态。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  FILE* in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  printf("read data: %s\n", file_contents);

  free(file_contents);

  fclose(in_file);
  exit(EXIT_SUCCESS);
}

ferror 也是 I/O 库的一部分,可以在 FILE 指针对象上调用。如果文件流上设置了错误位,它将返回一个非零指示器。请注意,这三个例子都是打印 filename 变量指定的文件内容。在前面的示例代码中,我们使用 printf 函数输出存储的内容,但更容易出错的方法是 fwrite 调用,它可以将给定的字节数打印到第四个参数指定的 FILE 流中。

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

const char* filename = "input.txt";

int main(void) {
  FILE* in_file = fopen(filename, "r");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  if (!feof(in_file) && !ferror(in_file))
    fread(file_contents, 1, sb.st_size, in_file);
  fwrite(file_contents, 1, sb.st_size, stdout);

  free(file_contents);

  fclose(in_file);
  exit(EXIT_SUCCESS);
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C IO