2013-01-15 37 views
8

Có thể trùng lặp (foobar.eof()!):
Why is iostream::eof inside a loop condition considered wrong?
eof() bad practice?Tại sao (foobar >> x) ưa thích hơn

giáo viên của tôi nói rằng chúng ta không nên sử dụng EOF để đọc trong tập tin văn bản hoặc thông tin tập tin nhị phân thay vào đó chúng ta nên sử dụng (afile >> x). Anh ta không giải thích tại sao, ai đó có thể giải thích cho tôi. Ai đó cũng có thể giải thích sự khác biệt trong hai phương pháp đọc khác nhau này là gì

//Assuming declaration 
//ifstream foobar 



(! foobar.eof()) 
{ 
    foobar>>x; // This is discouraged by my teacher 

} 


while (foobar>>x) 
{ 
    //This is encouraged by my teacher 

} 
+0

[this] (http://stackoverflow.com/questions/6512173/ifstream-not-reading-eof-character) và nhiều thứ khác nữa. – Rapptz

Trả lời

13

Vì tệp không kết thúc trước khi bạn cố gắng đọc nó.

operator>> trả về một tham chiếu đến suối trong tình trạng đó là sau đọc đã cố gắng và cả thành công hay thất bại, và những dòng đánh giá để true nếu nó thành công hay false nếu nó thất bại. Thử nghiệm cho eof() đầu tiên có nghĩa là tệp có thể không có dữ liệu hữu ích trong đó nhưng chưa có ở EOF, sau đó khi bạn đọc từ nó, nó ở EOF và đọc không thành công.

Một chi tiết quan trọng khác là operator>> cho luồng bỏ qua tất cả không gian trắng hàng đầu, không phải khoảng trắng theo sau. Đây là lý do tại sao một tập tin không thể ở EOF trước khi đọc và được tại EOF sau khi đọc. Ngoài ra, các công trình trước đây hoạt động khi dữ liệu tiếp theo trong tệp là dữ liệu không thể đọc vào số nguyên (ví dụ, dữ liệu tiếp theo là x), không chỉ khi nó ở EOF, điều này rất quan trọng.

Ví dụ:

xem xét mã:

int x, y; 

f >> x; 

if (!f.eof()) 
    f >> y; 

Giả sử f là một tập tin có chứa dữ liệu 123␣ (các ␣ nghĩa không gian), đọc đầu tiên sẽ thành công, nhưng sau đó các tập tin không còn số nguyên trong đó và nó là không phải tại EOF. Lần đọc thứ hai sẽ thất bại và tệp sẽ ở EOF, nhưng bạn không biết vì bạn đã kiểm tra EOF trước khi bạn thử đọc. Sau đó, mã của bạn tiếp tục gây ra hành vi không xác định vì y chưa được khởi tạo.

+0

Ý của bạn là gì? – Computernerd

+1

@Computernerd xem ví dụ của tôi. –

+0

Tôi thích lời giải thích của bạn. Đó là thẳng vào vấn đề và dễ hiểu. – paddy