使用 C 語言中的 feof 函式
Jinku Hu
2023年10月12日
本文將介紹幾種在 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);
}
作者: Jinku Hu