2012-08-23 38 views
6

thể trùng lặp:
“while(!feof(file))” is always wrongC đọc tập tin nhị phân

Nếu tôi viết một mảng đến tập tin đầu ra và tôi đóng file, sau đó mở tập tin một lần nữa và đọc tất cả mọi thứ cho đến khi cuối -of-file là đạt được, mặc dù tập tin chỉ chứa 4 số, chương trình sẽ đọc và in 5 số, tại sao?

đầu ra chương trình:

a[0] = 4 
a[1] = 7 
a[2] = 12 
a[3] = 34 
a[4] = 34 

save.bin (với một trình soạn thảo hex)

04000000 07000000 0C000000 22000000 

#include <stdio.h> 
#include <stdlib.h> 
#define path "save.bin" 

int main(void) 
{ 
    FILE *f=NULL; 
    int a[]={4,7,12,34},i,n=4,k; 
    f=fopen(path,"wb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    for(i=0;i<n;i++) // or I could use fwrite(a,sizeof(int),n,f); 
    fwrite(&a[i],sizeof(int),1,f); 
    fclose(f); 
    f=fopen(path,"rb"); 
    if(f==NULL) 
    { 
    perror("Error"); 
    exit(1); 
    } 
    i=0; 
    while(!feof(f)) 
    { 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 
    printf("\n"); 
    fclose(f); 
    return 0; 
} 
+0

Cảm ơn bạn rất nhiều !!! – Cristi

Trả lời

9

feof(fp) trở thành sai (tức là giá trị khác 0) chỉ khi bạn cố gắng đọc qua kết thúc tệp. Điều đó sẽ giải thích tại sao vòng lặp được nhập vào nhiều hơn những gì bạn mong đợi.

Từ documentation:

The function feof() tests the end-of-file indicator for the stream 
    pointed to by stream, returning nonzero if it is set. The end-of- 
    file indicator can be cleared only by the function clearerr(). 

Cũng đọc bài: Why is “while (!feof (file))” always wrong?

+3

+1 để giải thích cách 'feof()' được đặt. – hmjd

1
while(!feof(f)) 
{ 
    fread(&k,sizeof(int),1,f); 
    printf("a[%d] = %d\n",i,k); /** THIS ASSUMES fread() WAS SUCCESSFUL. **/ 
    i++; 
} 

Kiểm tra cho kết thúc của file immedately sau khi cuộc gọi đến fread() hoặc kiểm tra giá trị trả lại là fread(), trả về số lượng mục được đọc trong trường hợp này là 1. Một cơ cấu lại có thể của vòng lặp:

while(1 == fread(&k,sizeof(int),1,f)) 
{ 
    printf("a[%d] = %d\n",i,k); 
    i++; 
} 

Sau khi kiểm tra vòng lặp feof() để đảm bảo EOF đã đạt được và vòng lặp không kết thúc do một số thất bại khác.

1

Tôi có cùng một vấn đề là tốt. Thay vào đó, hãy thử thay thế:

i=0; 
    while(true) 
    { 
    fread(&k,sizeof(int),1,f); 
    if(feof(f)) 
     break; 

    printf("a[%d] = %d\n",i,k); 
    i++; 
    } 

Rõ ràng là không trả về kết quả đúng trừ khi bạn đã đọc hết phần cuối của tệp. Những gì tôi làm khi viết mảng vào tệp nhị phân là viết kích thước đầu tiên, vì vậy tôi biết chính xác lượng dữ liệu tôi sắp đọc khi đọc lại.

Các vấn đề liên quan