2008-11-20 5 views
12

Có cách nào để có được một điều kiện lỗi cụ thể khi một dòng C++ mở không thành công? Đó là, cho dù nó không thành công bởi vì các tập tin không tồn tại, hoặc quyền đã sai, hoặc vv Về cơ bản tôi đang tìm kiếm chức năng tương đương với errno cho fopen() trong đồng bằng C.Bạn có thể nhận được một điều kiện lỗi cụ thể khi mở một luồng C++ không?

GCC dường như đặt errno đúng cách , nhưng điều đó dường như không được yêu cầu bởi tiêu chuẩn C++ và tôi không thể xác định liệu đây có phải chỉ là một tạo phẩm theo cách họ đã triển khai luồng hay một tính năng có chủ ý (và do đó tôi không biết liệu nó có tồn tại lâu dài hay không phiên bản).

Có cách nào để nhận thông tin này một cách đáng tin cậy, hoặc bằng tiêu chuẩn C++ hoặc không vô tình trong một hoặc nhiều trình biên dịch chính?

Trả lời

0

Trong Visual Studio fopen và các thiết lập tương tự, hãy đặt giá trị mã lỗi cuối cùng. Nó có thể được truy xuất với GetLastError(). Kết quả sẽ là một trong các giá trị these.

+0

Bạn có bất kỳ liên kết nào đến nơi được trình bày trong tài liệu VS không? Tôi đã nhìn vào các trang dòng trên MSDN nhưng tôi không thể tìm thấy bất kỳ đề cập đến hành vi này. Tôi không nói nó không hoạt động như thế này nhưng sẽ tốt hơn nếu thấy một số tài liệu chính thức. –

+0

Tôi không nghĩ rằng nó được trình bày trong tài liệu VS. Hoặc có lẽ google-foo của tôi quá yếu. Tuy nhiên tôi đã tìm thấy một số bài viết diễn đàn sao lưu hồi ức của tôi rằng fopen và như thế là tất cả hàm bao quanh các hàm winapi tương đương của chúng. Vì vậy, fopen thực sự đang gọi CreateFile, đặt mã lỗi. Bất kể, một bài kiểm tra nhanh phải chịu đựng (ít nhất là để dễ dàng mô phỏng các lỗi tệp). Tôi sẽ tự mình làm và đăng kết quả. Nhưng, than ôi, tôi không có quyền truy cập dễ dàng vào phòng thu trực quan vào lúc này. –

4

Bạn có thể xem các cờ ios (badbit, eofbit, failbit, goodbit) vì các lý do chung. Kiểm tra sẽ dễ dàng hơn khi sử dụng ios :: bad(), ios :: fail(), ios :: eof() hoặc ios :: good(). Luồng cũng có thể được đặt để tạo ngoại lệ do lỗi, sử dụng ios :: exceptions().

Báo cáo lỗi I/O chi tiết có thể có sẵn trong một số triển khai, như bạn chỉ ra cho GCC. Bạn có thể phải dựa vào hành vi này cho các trình biên dịch khác nhau. Nếu có cơ hội cho nhiều trình biên dịch, hãy đảm bảo kiểm tra và có thể bao gồm các câu lệnh tiền xử lý để kiểm tra trình biên dịch hiện tại, v.v.
Theo như tôi biết, nơi duy nhất khác được thảo luận là trong proposed TR2 additions.