使用 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