Bài quản lí SV - Lỗi đọc file EOF không dừng

Em đang làm bài quản lí sv sử dụng Linkedlist và có hàm đọc như sau

void docFile(Node*& head, char fileName[])  {
 FILE* fp;
 int i = 0;
 fopen_s(&fp, fileName, "r");
 if (fp == NULL) {
    cout << "Khong mo duoc tap tin!\n";
    return;
 }
 cout << "Chuan bi doc file: "; puts(fileName);
 HSSV x;
 int gioitinh = 0;
 while (fscanf(fp, "%5d%30s%1d%2d%2d%4d%5f%5f%5f%5f%10s", &x.MSSV, &x.hoten,

    &gioitinh, &x.NgSinh.ngay, &x.NgSinh.thang, &x.NgSinh.nam,

    &x.dToan, &x.dLy, &x.dHoa,
    &x.dTB, &x.xLoai) != EOF)
 {
    i++;
    x.gtinh = gioitinh;
    addLast(head, x);
    cout << " So luong "<< i;
 }
 cout << " So luong Student co san trong file la: " << i << endl;
 cout << endl;
 fclose(fp);
 return;
}

khi đọc file thì nó sẽ bị rơi vào tình trạng loop vô hạn. Kể cả khi GhiFile trước với cấu trúc file tương tự rồi đọc lại file đó vẫn bị. Nhưng với lúc dùng Array thì không có tình trạng như vậy. Mong mọi người chỉ cách khắc phục, em cảm ơn !

Bạn xem các định dạng đọc đã đúng chưa.
Tập tin dữ liệu bạn định dạng ra sao?
Khi dữ liệu sai định dạng, scanf sẽ đứng và đọc mãi 1 chỗ, trả về 0 và mãi mãi.
Như đoạn dưới đây, sai định dạng số nó sẽ dừng tại 1 chỗ và lặp vô tận:
https://onlinegdb.com/82gv8LItk
main.c

#include <stdio.h>
int main(){
    freopen("INP", "r", stdin);
    int a, r;
    while((r = scanf("%d ", &a)) != EOF){
        printf("a: %d, scanf return: %d\n", a, r);
    }
    return 0;
}

INP

12 34 56 some thing wrong 999

Kết quả:

a: 12, scanf return: 1
a: 34, scanf return: 1
a: 56, scanf return: 1
a: 56, scanf return: 0
a: 56, scanf return: 0
a: 56, scanf return: 0
...

scanf, fscanfsscanf có cách đọc như nhau, chỉ khác tham số là luồng nó đọc.

Để giải quyết nhanh gọn thì bạn nên so sánh với số lượng tham số đọc thành công.
Bạn cần nó đọc bao nhiêu tham số thì so sánh với bấy nhiêu. Như trên đoạn mã của mình, thay vì so sánh với != EOF, mình đổi lại là == 1.
Kết quả là:

a: 12, scanf return: 1
a: 34, scanf return: 1
a: 56, scanf return: 1

Mặc khác, bạn chú ý định dạng của scanf truyền vào và tập tin bạn đọc có trùng khớp không. %10d mà tập tin chỉ có 3 chữ số hoặc 12 chữ liên tiếp nhau thì điều gì xảy ra?

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?