2015-05-22 14 views
5

Wenn Sie mit Dateien arbeiten, welches der beiden folgenden Beispiele wird bevorzugt? Bietet eine bessere Leistung als die andere? Gibt es überhaupt einen Unterschied?ifstream und ofstream oder fstream mit Ein- und Ausgabe

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

Die Verwendung eines 'istream ', in dem ein' ostream 'erwartet wird, führt zu einem Fehler, was Ihnen viel Kopfkratzen erspart, wenn Sie versehentlich einen' fstream' im Eingabemodus öffnen, den der Compiler gewonnen hat beschwere dich nicht. – user657267

Antwort

11

Performance-weise, gibt es wahrscheinlich nur vernachlässigbare Unterschiede sind in diesem Fall. Im besten Fall speichern Sie ein wenig Erinnerung.

Was zählt, ist, dass der erste Fall mit der Semantik hilft: ein std::fstream könnte in Eingang, Ausgang oder beides geöffnet werden. Aus diesem Grund müssen Sie die Deklaration überprüfen, um sicher zu sein, während std::ifstream und std::ofstream wird klar machen, was Sie tun. Der zweite Fall hat mehr Platz für menschliche Fehler, weshalb er vermieden werden sollte.

Meine eigene Faustregel ist, eine std::fstream zu verwenden, wenn Sie Lese- und Schreibzugriff auf die Datei und nur in diesem Fall benötigen.

0

einfach die prägnante Form verwenden, wenn Sie eine anderes Verhalten braucht ... sonst zu tun, ist nur Platz für mehr Fehler zu erstellen. FWIW, wenn möglich, ich Umfang bevorzugen, den Strom und überprüfen die offen wie folgt gearbeitet:

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

Würden Sie auch vorschlagen, diese Dateiprüfungsmethode über "if (input.is_open())" zu verwenden? –

+0

@ishyfishy: definitiv - ich erinnere mich nicht an das letzte Mal, als ich 'is_open()' benutzt habe. –

+1

Diese Methode hat ein paar interessante Punkte: Der Stream wird nur bis zum Ende des 'if's leben, so dass Sie sich keine Gedanken darüber machen müssen, die Datei zu schließen und die implizite Konvertierung in bool der Streams zu nutzen . – meneldal