使用 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 語言中使用 feof
和 ferror
函式來測試檔案流的有效位置
另外,在我們讀取檔案內容之前,可以利用 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); }
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: Jinku Hu