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!
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
@ jewfro- Yep, điều đó nghe có vẻ đúng! – templatetypedef
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'. –