2013-02-26 4 views
5

Il seguente codice è stato compilato con VC++ Nov 2012 CTP su Windows 7 x64.Perché ofstream ("log.txt", ios :: app | ios :: trunc); fallire sempre?

#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 non dice che ios::app non può essere combinato con ios::trunc.

Quali sono le esatte semantica di ios::app e ios::trunc?

+1

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

+1

La documentazione non dice che 'ios :: app' non può essere combinato con' ios :: trunc'. – xmllmx

+0

Cosa stai cercando di fare? std :: ios :: trunc sostanzialmente elimina tutto mentre std :: ios :: app si aggiunge. – CLearner

risposta

17

Il costruttore filebuf al quale sono passati questi flag & dagger; ha comportamenti basati su quelle bandiere definite nella Tabella 132 in 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"   | 
+-----------------------------------+-------------------+ 

Come si può vedere, la combinazione di bandiera è non trovato in tale tabella.

[C++11: 27.9.1.4/2]:[..] Se mode non è una combinazione di bandiere indicati nella tabella allora l'open fallisce.

Quelle sono la semantica.

e pugnale;[C++11: 27.9.1.7/2] & [C++11: 27.9.1.11/2] indica che la modalità viene passata dall'oggetto flusso all'oggetto buffer.

+0

Questa è una buona risposta. Tuttavia, qui vorrei dare il merito a Bo Persson, perché è il primo di coloro che danno risposte corrette. La sua risposta è un commento piuttosto che una risposta. – xmllmx

+0

@xmllmx Ah, così ha fatto. –

+1

@xmllmx Quel commento è stato rimosso dall'asse contundente di un moderatore. –

6
  • app (= aggiungono): impostare indicatore di posizione del flusso alla fine del flusso prima di ogni operazione di uscita
  • trunc (= troncamento) qualsiasi contenuto corrente viene scartato, assumendo una lunghezza pari a zero all'apertura.

Come potete vedere, non ha senso mettere entrambi insieme.

+1

Si prega di tenere commenti per chiedere domande di chiarimento su e rispondi. La discussione estesa su un particolare argomento dovrebbe essere tenuta a [Chat] (http://chat.stackoverflow.com). Inoltre, le discussioni che si trasformano in namecalling saranno rimosse. –