使用 C 語言中的 feof 函式

Jinku Hu 2023年1月30日 2021年2月28日
  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);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C IO