2015-05-22 13 views
5

Quando si tratta di file, quale dei due esempi di seguito è preferito? Si fornisce prestazioni migliori rispetto alle altre? C'è qualche differenza?ifstream e ofstream o fstream using in e out

ifstream input("input_file.txt"); 
ofstream output("output_file.txt"); 

vs

fstream input("input_file.txt",istream::in); 
fstream output("output_file.txt",ostream::out); 
+2

Utilizzando un 'istream' in cui è previsto un' ostream' causerà un errore, questo ti farà risparmiare un sacco di grattacapi, quindi se dovessi utilizzare accidentalmente un 'fstream' aperto in modalità input, che il compilatore ha vinto mi lamento. – user657267

risposta

11

delle prestazioni, ci sono differenze probabilmente solo trascurabili in questo caso. Nel migliore dei casi stai risparmiando un po 'di memoria.

Ciò che conta è che il primo caso aiuti con la semantica: un std::fstream potrebbe essere aperto in input, output o entrambi. Per questo motivo è necessario verificare la dichiarazione per accertarsi che durante l'utilizzo di std::ifstream e std::ofstream sia chiaro cosa si sta facendo. Il secondo caso ha più spazio per l'errore umano, motivo per cui dovrebbe essere evitato.

La mia regola generale consiste nell'utilizzare un std::fstream quando è necessario sia l'accesso in lettura che in scrittura al file e solo in questo caso.

0

Basta usare la forma più concisa a meno che non hai bisogno di un comportamento diverso ... di fare altrimenti è solo per creare spazio per altri errori. FWIW, quando possibile preferisco la portata del flusso e controllare l'apertura funzionava così:

if (std::ifstream input{"input_file.txt"}) 
    ...use input... 
else 
    ...log and/or throw... 
+0

Suggeriresti anche di usare il metodo di controllo dei file su "if (input.is_open())"? –

+0

@ishyfishy: sicuramente - non mi ricordo l'ultima volta che ho usato 'is_open()'. –

+1

Questo metodo ha un paio di punti interessanti: lo stream vivrà solo fino alla fine di "if", quindi non dovrai preoccuparti di dimenticare di chiudere il file e puoi fare uso della conversione implicita in bool dei flussi . – meneldal