2013-06-19 33 views
6

Tôi chỉ sửa đổi cho kỳ thi của tôi và không thể lấy đầu của tôi xung quanh sau được cung cấp bởi giảng viên của chúng tôi:Tại sao đọc tập tin đầu tiên sau đó kiểm tra?

Khi mở fstreams, kiểm tra xem bạn đã mở hoặc không

  • Sau đó đọc trước kiểm tra input_file.fail()

  • Nếu bạn kiểm tra trước khi đọc, bạn có thể kết thúc với một đầu vào không mong muốn thêm

Không có ý nghĩa gì với tôi khi đọc đầu tiên, bạn có nên kiểm tra trước không?

Nếu bất cứ ai có thể giải thích, tôi sẽ rất biết ơn :)

Trả lời

10

input_file.fail() xác định nếu bất kỳ hoạt động trước đã thất bại, không xem sắp tới hoạt động sẽ thất bại. Do đó, nếu bạn viết này:

if (!input_file.fail()) { 
    int value; 
    input_file >> value; 

    /* ... process value ... */ 
} 

Sau đó, sau khi đọc value, bạn không có ý tưởng nào cho dù bạn thực sự đọc bất cứ điều gì thành công hay không. Tất cả những gì bạn biết là ngay trước bạn đã đọc, mọi thứ đều hoạt động chính xác. Bạn hoàn toàn có thể không đọc được số nguyên, hoặc vì bạn nhấn vào cuối tệp hoặc dữ liệu trong tệp không phải là số nguyên.

Mặt khác, nếu bạn viết

int value; 
input_file >> value; 

if (!input_file.fail()) { 
    /* ... process value ... */ 
} 

Sau đó, bạn cố gắng để làm một đọc. Nếu thành công, bạn sẽ xử lý giá trị bạn đã đọc. Nếu không, bạn có thể phản ứng với thực tế là thao tác cuối cùng thất bại.

(Bạn thậm chí có thể dễ thương hơn này:.

int value; 
if (input_file >> value) { 
    /* ... process value ... */ 
} 

trong đó kết hợp các thao tác đọc và thử nghiệm vào một Đó là rõ ràng hơn nhiều ở đây mà bạn đang xác nhận rằng đọc thành công.)

Nếu bạn đang đọc trong một vòng lặp, một cách rất rõ ràng để làm điều này là

for (int value; input_file >> value;) { 
    /* ... process value ... */ 
} 

Điều này làm cho bạn biết rõ khi bạn có thể tiếp tục đọc các giá trị từ tệp.

Hy vọng điều này sẽ hữu ích!

+0

Có! Tất cả đều có ý nghĩa. Và sau đó nếu nó không thành công, tập tin rõ ràng, thông báo lỗi vv vv? Cảm ơn bạn! – jewfro

+0

@ jewfro- Yep, điều đó nghe có vẻ đúng! – templatetypedef

+0

Các phím tắt cho if và vòng lặp hoạt động vì toán tử '>>' trả về một tham chiếu đến luồng và toán tử 'bool' trên luồng gọi là' fail'. –