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) | EOF | Ký tự (int) |
fgetc(fp) | EOF | Ký tự (int) |
getchar() | EOF | Ký tự (int) |
fgets(s, n, fp) | NULL | Con trỏ s |
fread() | Số phần tử < count | Số phần tử đọc được |
fscanf() | EOF | Số 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