2010-11-17 30 views
21

Một đồng nghiệp chỉ nói với tôi rằng mã này:ifstream: kiểm tra nếu mở ra thành công

std::ifstream stream(filename.c_str()); 
if (!stream) 
{ 
    throw std::runtime_error(".."); 
} 

sẽ là sai lầm. Anh ta nói ifstream đánh giá là 0 nếu mở thành công. Mã của tôi hoạt động, nhưng tôi muốn tìm tài liệu nhưng không thấy nơi nó nói làm thế nào để kiểm tra xem mở đã thành công. Bạn có thể chỉ cho tôi không?

Trả lời

29

operator!is overloaded cho std::ifstream, vì vậy bạn có thể làm điều này.

Theo ý kiến ​​của tôi, đây là một sự lạm dụng khủng khiếp của quá tải nhà điều hành (bởi ủy ban tiêu chuẩn). Nó rõ ràng hơn những gì bạn đang kiểm tra nếu bạn chỉ cần làm if (stream.fail()).

+6

đừng quên kiểm tra 'stream.bad()', 'stream.good()', 'stream.fail()', và 'stream.is_open()'. thở dài ... – Inverse

+0

cảm ơn rất nhiều về liên kết! Tôi đồng ý rằng việc kiểm tra bằng cách sử dụng toán tử này không tốt, vì vậy tôi sẽ thay đổi nó. Chúng tôi sẽ không có cuộc thảo luận nếu (stream.fail()). – Philipp

+9

The! bị quá tải để kiểm tra 'fail' và 'bad' –

8

Bạn cũng có thể sử dụng is_open() để kiểm tra xem nó có hoạt động hay không! được phép (nó không kiểm tra không, đó là một đặc biệt overload of !)

chỉnh sửa:
Chỉ cần không quan tâm - tại sao điều này không ném một ngoại lệ?
Chỉ là các luồng đã được giới thiệu trước các ngoại lệ
hoặc chúng ta đang ở trong điều C++ cũ của - nó chỉ là một lỗi không đủ đặc biệt để trở thành ngoại lệ.

8

Bạn có thể tạo một luồng cụ thể ném một ngoại lệ lên bất kỳ lỗi eof/fail/bad nào bằng cách gọi hàm ios::exceptions() với bitmask thích hợp. Vì vậy, bạn có thể viết lại ví dụ trong câu hỏi ban đầu ở trên là:

std::ifstream stream; 
stream.exceptions(std::ios::failbit | std::ios::badbit); 
stream.open(filename.c_str()); 

Luồng ở đây sẽ ném ngoại lệ khi đặt quỹ đạo hoặc badbit. Ví dụ: nếu ifstream::open() không thành công, nó sẽ đặt hộp số không và ném ngoại lệ. Tất nhiên, điều này sẽ ném một ngoại lệ sau này nếu một trong các bit này được đặt trên luồng, do đó, việc viết lại này không giống chính xác như ví dụ ban đầu. Bạn có thể gọi

stream.exceptions(std::ios::goodbit); 

để hủy tất cả ngoại lệ trên luồng và quay lại kiểm tra lỗi.

2

Đồng nghiệp của bạn là sai. Có lẽ anh ta quên rằng bạn không viết C.

Mã được bật ngay. Đó là chính xác cách bạn nên kiểm tra trạng thái luồng.

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