2013-02-26 5 views
5

Der folgende Code wurde mit VC++ Nov 2012 CTP unter Windows 7 x64 kompiliert.Warum ist ofstream ("log.txt", ios :: app | ios :: trunc); immer scheitern?

#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 sagt nicht, dass ios::app nicht mit ios::trunc kombiniert werden können.

Was sind die genaue Semantik von ios::app und ios::trunc?

+1

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

+1

Die Dokumentation sagt nicht, dass "ios :: app" nicht mit "ios :: trunc" kombiniert werden kann. – xmllmx

+0

Was versuchst du zu tun? std :: ios :: trunc löscht im Prinzip alles, während std :: ios :: app anfügt. – CLearner

Antwort

17

Der filebuf Konstruktor, an den diese Flags übergeben werden & dagger; hat Verhalten basierend auf den in Tabelle 132 in C++ 11 definierten Fahnen:

+-----------------------------------+-------------------+ 
|  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"   | 
+-----------------------------------+-------------------+ 

Wie Sie sehen können, Ihre Flagge Kombination ist nicht in dieser Tabelle gefunden.

[C++11: 27.9.1.4/2]:[..] Wenn mode nicht irgendeine Kombination von Flaggen in der Tabelle angegeben ist dann die offene ausfällt.

Das sind die Semantik.

& dolch;[C++11: 27.9.1.7/2] & [C++11: 27.9.1.11/2] zeigen Sie uns, dass der Modus vom Stream-Objekt an das Pufferobjekt übergeben wird.

+0

Dies ist eine gute Antwort. Aber hier möchte ich Bo Persson Anerkennung zollen, denn er ist der erste von denen, die richtige Antworten geben. Seine Antwort ist eher ein Kommentar als eine Antwort. – xmllmx

+0

@xmllmx Ah, also tat er es. –

+1

@xmllmx Dieser Kommentar wurde jetzt von der stumpfen Axt eines Moderators entfernt. –

6
  • app (= append): die Stellungsanzeige des Stroms bis zum Ende des Stroms vor jeder Ausgabeoperation
  • trunc (= Trunkat) jeder aktueller Inhalt abgeworfen wird, eine Länge von Null unter der Annahme, beim Öffnen.

Wie Sie sehen können, macht es keinen Sinn, beide zusammen zu setzen.

+1

Bitte halten Sie Kommentare zu Fragen zur Klärung von Fragen an und antworte. Die erweiterte Diskussion zu einem bestimmten Thema sollte in [Chat] (http://chat.stackoverflow.com) aufbewahrt werden. Darüber hinaus werden Diskussionen, die in Namensaufrufe umgewandelt werden, entfernt. –