Mỗi cuộc gọi hệ thống mà không cập nhật giá trị errno
.
Vì vậy, bạn có thể có thêm thông tin về những gì xảy ra khi một mở ifstream
thất bại bằng cách sử dụng một cái gì đó như:
cerr << "Error: " << strerror(errno);
Tuy nhiên, vì mọi hệ thống gọi cập nhật các giá trị errno
toàn cầu, bạn có thể gặp sự cố trong ứng dụng đa luồng, nếu một cuộc gọi hệ thống khác gây ra lỗi giữa việc thực thi f.open
và sử dụng errno
.
Trên hệ thống với POSIX tiêu chuẩn:
errno là thread-địa phương; đặt nó trong một chủ đề không ảnh hưởng đến giá trị của nó trong bất kỳ chủ đề nào khác.
Sửa (nhờ Arne Mertz và những người khác trong các ý kiến):
e.what()
dường như lúc đầu là một hơn C++ - cách idiomatically đúng thực hiện điều này, tuy nhiên chuỗi trả lại bởi chức năng này phụ thuộc vào việc thực hiện và (ít nhất là trong lib ++ + của G ++) chuỗi này không có thông tin hữu ích về lý do đằng sau lỗi ...
Nguồn
2013-06-27 09:02:15
có thể trùng lặp của [C++ ifstream Error Checking] (http://stackoverflow.com/questions/13446593/c-ifstream-error-checking) –
có thể trùng lặp của [Bạn có thể nhận được một điều kiện lỗi cụ thể khi một dòng C++ mở không?] (http://stackoverflow.com/questions/303966/can-you-get-a-specific-error-condition-when-ac-stream-open-fails) – arne
@Alex Farber: Chắc chắn rồi. 'cerr <<" Mã lỗi: "<< strerror (errno); // Nhận một số thông tin về lý do tại sao' có vẻ liên quan đến câu hỏi. –