Frage

C ++ Datei-I / O ist härter als C-Datei I / O. So in C ++, eine neue Bibliothek für Datei erstellen I / O nützlich ist oder nicht? Ich meine <fstream> Kann jemand bitte in C irgendwelche Vorteile gibt es sagt ++ Datei-I / O?

War es hilfreich?

Lösung

Meinung

Ich weiß nicht, von jedem realen Projekt, das C ++ Streams verwendet. Sie sind zu langsam und schwierig zu bedienen. Es gibt mehrere neuere Bibliotheken wie FastFormat und die JALF ) kann es Möglichkeiten, es schneller zu machen.

Schwierigkeit verwenden

Das kann ich nicht printf argumentieren () nicht kurz und bündig, aber es ist flexibler (IMO) und einfacher zu verstehen, wenn man einmal die anfängliche WTF für den Makrocode zu erhalten.

double pi = 3.14285714;

cout << "pi = " << setprecision(5)  << pi << '\n';
printf( "%.5f\n", pi );

cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n'; 
printf( "%+.3f\n", pi );

cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );

Die Frage

Ja, kann sein, bedarf es einer besseren C ++ Bibliothek, viele sein FastFormat ist, dass Bibliothek, Die Zeit wird zeigen.

dave

Andere Tipps

Puffer Überschreitungen Banishing scheint wie ein großer Gewinn für C ++ zu mir.

Bitte haben Sie einen Blick auf

http://www.ddj.com/cpp/184403651

, dann werden Sie es vorziehen, C ++ I / O als C I / O.

kurzum C bevorzugt wird, wenn Sie Datengröße vor wissen lesen oder schreiben und für die Geschwindigkeit. C ++ ist bevorzugt, wenn Sie nicht über Datengröße kennen und für effizienten Code.

Als Antwort auf David Allan Finch Antwort, ich einen Fehler in seinem Benchmarking Code festgelegt (er gespült, um den Strom in der C ++ Version nach jeder einzelnen Zeile) und reran den Test:

Die C ++ Schleife sieht nun wie folgt aus:

start = time(0);
{
    ofstream outdata("example2.txt");
    for( int i = 0; i < max; i++ )
    {
        outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
    }
}
end = time(0);

Ich betreiben 10000000 Iterationen (10-mal mehr als im ursprünglichen Code, denn sonst sind die Zahlen einfach zu klein für die Zeit () 's lausig Auflösung gibt uns etwas Sinnvolle)) Und der Ausgang ist:

G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s

MSVC9.0:
C FILE: 10s
C++ Streams: 23s

(beachten Sie, wurde die MSVC-Version auf meinem Laptop mit einer deutlich langsameren Festplatte ausgeführt wird)

Aber das gibt uns einen Performance-Unterschied von 1.5-2.3x, abhängig von der Implementierung. und andere externe Faktoren.

Die Leistungsunterschiede zwischen printf () / fwrite Stil I / O und C ++ IO Formatierung Strömen sind sehr abhängig von der Implementierung. Einige Implementierungen (Visual C ++ zum Beispiel), bauen ihre IO-Streams auf den FILE * Objekte und dies neigt dazu, die Laufzeit der Komplexität ihrer Umsetzung zu erhöhen. Beachten Sie jedoch, dass es keine besondere Beschränkung, die Bibliothek in dieser Art und Weise zu implementieren.

In meiner eigenen Meinung nach die Vorteile von C ++ I / O sind wie folgt:

  • Typsicherheit, wie bereits oben erwähnt.
  • Flexibilität der Umsetzung. Code kann bestimmte Formatierung oder eingegeben oder von einem generischen Ostream oder istream Objekt zu tun geschrieben werden. Die Anwendung kann dann ruft diesen Code mit jeder Art von Strom-Objekt abgeleitet. Wenn der Code, den ich geschrieben habe und getestet gegen eine Datei nun an einer Steckdose angewandt werden muss, eine serielle Schnittstelle oder eine andere Art von internem Strom, können Sie einen Stream Implementierung spezifisch für diese Art von I / O erstellen. Die Erweiterung des C-Stil-I / O in dieser Art und Weise ist nicht einmal in der Nähe möglich.
  • Flexibilität in Locale-Einstellungen: der C Ansatz einen einzigen globalen locale der Verwendung ist, meiner Meinung nach, sehr mangelhaft. Ich habe Fälle erlebt, in denen ich Bibliothek Code aufgerufen (DLL), die die globalen Locale-Einstellungen unter meinen Code geändert und vollständig meine Ausgabe vermasselt. Ein C ++ Stream ermöglicht () jede locale in einem Stream-Objekt zu durchtränken.

std :: ifstream und std :: ofstream sind bereits in stl Bibliothek. Sie müssen nicht selbst erstellen.

Der Hauptvorteil ist, alle Ausgänge und Eingänge Typ Sicherheit sind.

C und C ++ sind zwei verschiedene Sprachen. C ++ Datei io dauert einige Zeit gewöhnen, aber sobald man Algorithmen verwenden, Ausnahmen usw. sie neigen dazu, sehr natürlich an ihren Platz zu fallen.

Jedes Mal, wenn ich brauche Eingänge zu nehmen / geben Ausgänge in einer Datei in C ++, benutze ich nur zwei Zeilen.

freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file

Jetzt können Sie Variablen scannen, wie Sie normalerweise von der Konsole tun würde, und was auch immer Sie drucken als Ausgabe in output.txt Datei angezeigt wird.

Also ich glaube nicht, Datei-I / O in C ++ ist hart, sein eher einfacher als c.

Lots. Nachteile auch. Siehe Sprache C ++ FAQ für weitere Details. Kurz:. Typsicherheit und benutzerdefinierte Typen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top