2013-06-11 31 views
7

Tôi đã có, có lẽ là câu hỏi tầm thường nhưng tôi không thể hiểu nó. Tôi đã viết mã đơn giản:VS8 không thể xử lý file.close(); file.open() ;, tại sao?

fstream file; 
file.open("data", ios::in); 
if(!file.good()){ 
    file.close(); 
    file.open("data", ios::out); 
    if(!file.good()) cout<<"not good"<<endl; 
    file<<"test"<<endl; 
    file.close(); 
} 

trong dự án VS8 C++ Express mới. Khi tôi chạy nó và "dữ liệu" không tồn tại, nó tạo ra tập tin, nhưng cũng trả về "không tốt" (thứ hai) để đầu ra không được ghi trong tập tin. Và bây giờ đến điều buồn cười. Nếu tôi biên dịch cùng một mã trong VS10 C++ Express và Code :: Blocks 12, nó hoạt động tốt.

Tại sao lại như vậy?

@edit Bạn tôi đã kiểm tra nó trên PC của mình với VS8 C++ Expres quá. Làm việc tương tự cho anh ta.

@ edit2 Tương tự như nhận xét của tôi với "giải pháp":

Buộc để xóa failbit với .clear(); phương pháp dường như hoạt động. Nó đau khổ khi bạn tìm hiểu trong IDE mới hơn và sau đó phải chuyển sang cũ hơn: /. Tho, nó mang đến bài học hay. Cảm ơn các bạn.

+2

Các trình biên dịch khác nhau đôi khi có các triển khai khác nhau của tiêu chuẩn. Đặc biệt là các trình biên dịch Microsoft ... – Appleshell

+0

Bạn có thể sử dụng 'is_open' thay cho' good'. –

+1

Có lẽ failbit không bị xóa sau lần thất bại đầu tiên. Nó trông giống như "mở" bây giờ xóa các failbit về thành công trong C++ 11 và có lẽ thay đổi này đã được thực hiện trong VS2010 với dự đoán của một số các tính năng tiêu chuẩn mới (bấm vào các tab cho thấy sự khác biệt giữa C + + 03 và C + +11 http://www.cplusplus.com/reference/fstream/fstream/open/) – statueuphemism

Trả lời

4

Điều này theo thiết kế. Trong C++ 98, đóng một fstream không xóa trạng thái lỗi và gọi open() trên một fstream không đặt lại trạng thái lỗi. Xem LWG Defect #409 để thảo luận về vấn đề này.

Hành vi đã được thay đổi trong C++ 11 sao cho trạng thái lỗi bị xóa (thông qua cuộc gọi đến clear()) nếu hoạt động mở thành công.

+0

Có bất kỳ nơi nào mà Microsoft chia sẻ thông tin này với nhau thông qua các nhà phát triển của nó, những người tình cờ đang xem xét các câu hỏi StackOverflow không? Tôi đã cố gắng tìm kiếm thông tin này một thời gian ngắn về hành vi của fstream :: mở trong VS2010 liên quan đến VS2008, nhưng không thể nhanh chóng tìm thấy bất cứ điều gì đáng giá. – statueuphemism

+0

@statueuphemism: Tài liệu về MSDN là tài liệu có thẩm quyền để thực hiện. Trang web [cppreference.com] (http://en.cppreference.com/w/) cũng rất tốt (đối với Thư viện chuẩn C++, đó là ý định của chúng tôi để triển khai các thư viện như được chỉ định; chúng tôi rất coi trọng sự tuân thủ). –

+0

Đây là bài viết MSDN cho fstream mở trong VS2010 (bắt nguồn từ basic_fstream :: open) mà không đề cập đến hành vi bạn mô tả như là bản cập nhật để tuân thủ C++ 0x (chỉ có bản nháp C++ 11 có sẵn cho Bản phát hành của VS2010): http://msdn.microsoft.com/en-us/library/4dx08bh4(v=vs.100).aspx Là nhà phát triển đang tìm cách có khả năng di chuyển sang phiên bản mới hơn của Visual Studio, hãy phát hành ghi chú cho ghi lại những thay đổi này sẽ rất hữu ích để ngăn chặn các lỗi tinh vi do thay đổi hành vi không có giấy tờ. Tôi cũng đã duyệt http://msdn.microsoft.com/en-us/library/dd465215(v=vs.100).aspx – statueuphemism

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