2013-02-26 29 views
5

Mã sau được biên dịch với VC++ tháng 11 năm 2012 CTP trên Windows 7 x64.Tại sao ofstream ("log.txt", ios :: app | ios :: trunc); luôn thất bại?

#include <fstream> 

using namespace std; 

int main() 
{ 
    ofstream fout("log.txt", ios::app|ios::trunc); 
    if (!fout) 
    { 
     cout << "An error occurred!" << endl; // Always go here! Why? 
    } 
} 

The cppreference.com website không nói rằng ios::app không thể được kết hợp với ios::trunc.

chính xác ngữ nghĩa của ios::appios::trunc là gì?

+1

http://en.cppreference.com/w/cpp/io/ios_base/openmode – Zeta

+1

Tài liệu không nói rằng 'ios :: app' không thể kết hợp với' ios :: trunc'. – xmllmx

+0

Bạn đang cố gắng làm gì? std :: ios :: trunc cơ bản loại bỏ mọi thứ trong khi std :: ios :: app appends. – CLearner

Trả lời

17

Nhà xây dựng filebuf mà các cờ này được chuyển qua & dagger; có hành vi dựa trên những lá cờ được quy định tại Bảng 132 trong C++ 11:

+-----------------------------------+-------------------+ 
|  ios_base flag combination  | stdio equivalent | 
| binary in out trunc app |     | 
+-----------------------------------+-------------------+ 
|    +     | "w"    | 
|    +    + | "a"    | 
|        + | "a"    | 
|    +  +   | "w"    | 
|  +       | "r"    | 
|  +  +     | "r+"    | 
|  +  +  +   | "w+"    | 
|  +  +    + | "a+"    | 
|  +      + | "a+"    | 
+-----------------------------------+-------------------+ 
| +   +     | "wb"    | 
| +   +    + | "ab"    | 
| +       + | "ab"    | 
| +   +  +   | "wb"    | 
| + +       | "rb"    | 
| + +  +     | "r+b"   | 
| + +  +  +   | "w+b"   | 
| + +  +    + | "a+b"   | 
| + +      + | "a+b"   | 
+-----------------------------------+-------------------+ 

Như bạn có thể thấy, sự kết hợp lá cờ của bạn là không tìm thấy trong bảng đó.

[C++11: 27.9.1.4/2]:[..] Nếu mode không phải là một sự kết hợp của lá cờ thể hiện trong bảng sau đó mở thất bại.

Đó là ngữ nghĩa.

& dagger;[C++11: 27.9.1.7/2] & [C++11: 27.9.1.11/2] cho chúng ta thấy rằng chế độ được truyền từ đối tượng luồng tới đối tượng bộ đệm.

+0

Đây là câu trả lời hay. Tuy nhiên, ở đây tôi muốn cung cấp tín dụng Bo Persson, bởi vì ông là người đầu tiên trong số những người đưa ra câu trả lời đúng. Câu trả lời của anh là một phần bình luận chứ không phải là một câu trả lời. – xmllmx

+0

@xmllmx Ah, vậy là anh ấy đã làm. –

+1

@xmllmx Nhận xét đó hiện đã bị xóa bởi rìu cùn của người điều hành. –

6
  • ứng dụng (= append): set chỉ báo vị trí của dòng đến cuối dòng trước mỗi hoạt động ngõ ra
  • trunc (= truncate) bất kỳ nội dung hiện tại bị loại bỏ, giả sử một chiều dài của zero khi mở.

Như bạn có thể thấy, bạn không nên đặt cả hai lại với nhau.

+1

Vui lòng ghi chú để đặt câu hỏi làm rõ và trả lời. Thảo luận mở rộng về một chủ đề cụ thể nên được giữ lại [Chat] (http://chat.stackoverflow.com). Ngoài ra, các cuộc thảo luận được đưa vào danh sách sẽ được xóa. –

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