Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

End of File (EOF) trong C: Đọc file đến hết

EOF là gì?

EOF (End Of File) là hằng số nguyên (thường là -1) định nghĩa trong <stdio.h>, báo hiệu đã đến cuối file hoặc luồng nhập. Không phải ký tự, là trạng thái.

Cách phát hiện EOF

  • Console (stdin): Nhấn Ctrl+Z (Windows) hoặc Ctrl+D (Linux/Mac)
  • File: Hàm đọc trả về EOF khi hết dữ liệu

Chương trình: Ghi file rồi đọc đến EOF

#include <stdio.h>

int main() {
    char ch;
    FILE *fp;
    
    // 1. Mở file ghi
    fp = fopen("std1.txt", "w");
    if (!fp) {
        printf("Khong the mo file de ghi!\n");
        return 1;
    }
    
    printf("Nhap van ban (Ctrl+Z de ket thuc):\n");
    
    // 2. Ghi từng ký tự đến EOF
    while ((ch = getchar()) != EOF) {
        putc(ch, fp);
    }
    
    fclose(fp);
    
    // 3. Mở file đọc
    fp = fopen("std1.txt", "r");
    if (!fp) {
        printf("Khong the mo file de doc!\n");
        return 1;
    }
    
    printf("\nNoi dung file:\n");
    
    // 4. Đọc từng ký tự đến EOF
    while ((ch = getc(fp)) != EOF) {
        putchar(ch);
    }
    
    fclose(fp);
    return 0;
}

Kết quả

Nhap van ban (Ctrl+Z de ket thuc):
Xin chao cac ban
Day la vi du ve EOF
^Z

Noi dung file:
Xin chao cac ban
Day la vi du ve EOF

Các hàm file và EOF

Hàm Trả về khi EOF Thành công
getc(fp)EOFKý tự (int)
fgetc(fp)EOFKý tự (int)
getchar()EOFKý tự (int)
fgets(s, n, fp)NULLCon trỏ s
fread()Số phần tử < countSố phần tử đọc được
fscanf()EOFSố mục đọc được
feof(fp)Khác 0 (true)0 (false)

Lưu ý quan trọng: KHÔNG dùng feof() điều khiển vòng lặp

// SAI - feof() chỉ true SAU KHI đọc thất bại
while (!feof(fp)) {
    fgets(buf, sizeof(buf), fp);
    printf("%s", buf);  // In thêm lần cuối (rác)
}

// ĐÚNG - Kiểm tra trả về của hàm đọc
while (fgets(buf, sizeof(buf), fp)) {
    printf("%s", buf);
}

// HOẶC
while ((ch = getc(fp)) != EOF) {
    putchar(ch);
}

Chương trình: Đếm dòng, từ, ký tự (wc style)

#include <stdio.h>
#include <ctype.h>

int main() {
    FILE *fp = fopen("input.txt", "r");
    if (!fp) return 1;
    
    int lines = 0, words = 0, chars = 0;
    int inWord = 0;
    int ch;
    
    while ((ch = getc(fp)) != EOF) {
        chars++;
        if (ch == '\n') lines++;
        if (isspace(ch)) {
            inWord = 0;
        } else if (!inWord) {
            inWord = 1;
            words++;
        }
    }
    
    fclose(fp);
    printf("Dong: %d, Tu: %d, Ky tu: %d\n", lines, words, chars);
    return 0;
}

EOF với binary file

Với file nhị phân, EOF (-1) có thể trùng với byte 0xFF. Dùng feof() và ferror() để phân biệt:

while (1) {
    int ch = getc(fp);
    if (ch == EOF) {
        if (feof(fp)) printf("Het file binh thuong\n");
        else if (ferror(fp)) printf("Loi doc file\n");
        break;
    }
    // Xu ly ch
}

Tóm tắt

  • EOF = -1 (thường), định nghĩa trong stdio.h
  • Console: Ctrl+Z (Win) / Ctrl+D (Unix)
  • Luôn kiểm tra trả về hàm đọc, KHÔNG dùng feof() làm điều kiện while
  • fgets() trả về NULL khi EOF, không phải EOF
  • Binary file: cần feof()/ferror() để phân biệt EOF và lỗi