Wann ist es gut, c ++ iostreams über ReadFile, WriteFile, fprintf usw. zu verwenden?

8

Ich finde, dass es sehr viel einfacher ist, Streams in C ++ anstelle von Windows-Funktionen wie ReadFile, WriteFile usw. oder sogar fprintf zu verwenden. Wann ist es nicht gut Streams zu verwenden? Wann ist es gut Streams zu verwenden? Ist es sicher Streams zu verwenden? Wie kommt es, dass viele Programmierer keine Streams verwenden?

Das ist nur etwas, worüber ich mich immer gewundert habe und vielleicht kann man etwas Weisheit abwerfen.

    
Brian T Hannan 21.01.2010, 17:58
quelle

7 Antworten

10
  

Wann ist es nicht gut Streams zu verwenden?

  • Streams sind nicht garantiert threadsicher. Es ist leicht, sich eine Situation auszumalen, in der Sie Streams ohne eine Synchronisierung nicht verwenden können.
  • Stream Objekte sind normalerweise ziemlich "schwer". Sie können für zu wenig Speicher oder eingebettete Umgebungen zu schwer sein.
  

Wann ist es gut, Streams zu verwenden?

Im Allgemeinen.

  

Ist es sicher, Streams zu verwenden?

Ja, aber Sie müssen vorsichtig sein, wenn Sie einen Stream asynchron teilen.

  

Wie kommt es, dass viele Programmierer keine Streams verwenden?

Präferenz, Stil oder sie lernten zuerst eine andere Methode (oder andere Sprache). Ich finde, dass viele alte "C ++" -Beispiele online mit einem C-Flavor geschrieben sind, wobei printf bevorzugt wird.

    
luke 21.01.2010, 18:09
quelle
11

Streams sind im Allgemeinen ziemlich sicher. Unter gewissen Umständen können sie langsam und / oder ungeschickt sein. Langsam ergibt sich hauptsächlich aus der Tatsache, dass sie zwischen Ihrem Code und dem Betriebssystem ein paar zusätzliche Ebenen vorschreiben, und unter Umständen können diese Ebenen zusätzlichen Aufwand verursachen. Die Ungeschicklichkeit ist hauptsächlich im Vergleich zu Cs printf, nicht der direkten Verwendung von etwas wie WriteFile (das Formatierung überhaupt nicht direkt unterstützt). Betrachten Sie jedoch zum Beispiel:

%Vor%

bis

%Vor%

Wenn Sie sich für i18n interessieren, verwendet printf eine Zeichenfolge, die einfach aus einer externen Quelle gelesen werden kann, wobei der C ++ - Stream die gesamte Formatierung in die Struktur des Codes einbettet, also fast beliebig Änderung der Formatierung erfordert das Umschreiben des Codes, Neukompilieren und erneutes Verknüpfen.

CreateFile, ReadFile , etc, erlauben auch eine Reihe von Dingen wie Speicherkarten und überlappendes Lesen und Schreiben, die von Iostreams überhaupt nicht unterstützt werden. Wenn Sie diese Situationen gut nutzen können, sind Iostreams oft nicht wettbewerbsfähig.

    
Jerry Coffin 21.01.2010 18:09
quelle
4

Sie können asynchrone Datei-I / O nicht mit Streams ausführen ...

    
Goz 21.01.2010 18:13
quelle
3
  1. Wenn Ihre App auf verschiedenen Plattformen portierbar sein soll.

  2. Wenn Sie mehr prägnanten Code wollen: Win32-Funktionen haben mehr ausgearbeitete Semantik, erfordern oft eine Sammlung von Funktionen, um etwas zu tun, und haben definitiv mehr Parameter.

Hassan Syed 21.01.2010 17:59
quelle
1

Es gibt drei Alternativen, die Sie hier erwähnt haben:

  1. C ++ - Streams (ostream, istream, fstream)
  2. C stdio (printf, sprintf fprintf)
  3. Windows-Dateien (ReadFile, WriteFile)

Optionen 1 & amp; 2 sind plattformunabhängig. Dies bedeutet, dass Sie den Code für Mac, Linux oder viele andere Betriebssysteme kompilieren können. Option 3 ist nur Windows. Das bedeutet, dass Sie es nur für Windows kompilieren können.

Bei der Entscheidung zwischen den Optionen 1 & amp; 2, ist es an, wie Sie es verwenden möchten. Die C-Bibliothek ist in Bezug auf Sprachen einfacher zu verwenden. Es ist ein Albtraum, Text durch alternative Sprachen in Streams zu ersetzen. Es ist jedoch viel einfacher, Streams threadsicher zu gestalten, komplexere Klassen in ein druckbares Format zu übersetzen und die Stream-Funktionen zu erweitern.

C ++ 's iostream gegen C's stdio ist ein sehr hitziges Argument, das an vielen anderen Stellen in diesem Forum diskutiert wird, wie z C ++ - Streams vs. C-style IO? und andere online-Stellen.

    
Stewart 04.11.2016 10:44
quelle
1

Einer der Gründe, warum ich printf () mag, ist, dass Formatzeichenfolgen selbst Ressourcen sein können, was mehr externe Kontrolle über die Programmausgabe erlaubt, ohne die Neukompilierung zu erzwingen.

Einer der Gründe, warum ich cout () mag, ist die rohe Geschwindigkeit.

Nach meiner Erfahrung ist dies ein ziemlich religiöses Thema.

    
dicroce 21.01.2010 18:09
quelle
1

Ein Grund ist i18n

%Vor%

vs

%Vor%     
Anurag 21.01.2010 18:13
quelle

Tags und Links