2010-01-21 12 views
8

Trovo che sia tremendamente più facile usare i flussi in C++ invece delle funzioni di Windows come ReadFile, WriteFile, ecc. O persino fprintf. Quando non è bene usare i flussi? Quando è bello usare i flussi? È sicuro usare i flussi? Come mai molti programmatori non usano i flussi?Quando è utile usare gli iostream C++ su ReadFile, WriteFile, fprintf, ecc ...?

Questa è solo una cosa di cui mi sono sempre chiesto e forse si può fare un po 'di saggezza.

+2

La libreria boost :: format è un'altra alternativa che fornisce una formattazione di tipo print-safe: http://www.boost.org/doc/libs/1_41_0/libs/format/doc/format.html – Void

+0

Uso frequente di 'boost :: format' potrebbe influire negativamente sulla tua performance. In un progetto che utilizza Boost 1.33, ho dovuto smettere di usare boost :: format a causa di problemi di prestazioni (misurati con un profiler). –

+0

Grazie, è bello saperlo. In realtà non ho mai provato ad aumentare, ma visto che è così popolare dovrei probabilmente verificarlo qualche volta. –

risposta

10

Quando non è opportuno utilizzare i flussi?

  • flussi non sono garantiti come thread safe. È facile immaginare una situazione in cui non è possibile utilizzare gli stream senza alcuna sincronizzazione.
  • Gli oggetti stream sono in genere piuttosto "pesanti". Loro possono essere troppo pesanti per la memoria insufficiente o gli ambienti incorporati.

Quando è opportuno utilizzare i flussi?

In generale.

È sicuro utilizzare gli stream?

Sì, ma bisogna fare attenzione quando si condivide uno stream in modo asincrono.

Come mai molti programmatori non utilizzano i flussi?

Preferenza, stile o hanno imparato prima un metodo diverso (o una lingua diversa). Trovo che molti dei vecchi esempi di "C++" online siano scritti con un sapore C, preferendo printf a cout.

+0

La risposta più completa e menziona le cose sulla sicurezza. –

3
  1. Quando si desidera che l'app sia trasferibile su piattaforme diverse.

  2. Quando si desidera un codice più sintetico: le funzioni di win32 hanno una semantica più elaborata, spesso richiedono una serie di funzioni per fare qualcosa e sicuramente hanno più parametri.

11

Gli stream sono generalmente abbastanza sicuri. In alcune circostanze, possono essere lenti e/o goffi. Lento, deriva principalmente dal fatto che impongono alcuni strati extra tra il tuo codice e il sistema operativo e, in circostanze errate, questi livelli possono aggiungere un sovraccarico. La goffaggine è per lo più paragonata alla stampa di C, non all'uso diretto di qualcosa come WriteFile (che non supporta affatto la formattazione). Ad esempio, tuttavia, prendere in considerazione:

printf("%2.2x", ch);` 

a

std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch; 
std::cout << setfill(' '); 

Quindi prendere in considerazione il fatto che se vi preoccupate per i18n, printf sta utilizzando una stringa che è facile da leggere in da una fonte esterna, dove la Lo stream C++ sta incorporando tutta la formattazione nella struttura del codice, quindi quasi ogni cambiamento nella formattazione richiede la riscrittura del codice, la ricompilazione e il ricollegamento.

CreateFile, ReadFile, ecc, consentono inoltre un numero di cose come file mappati in memoria e lettura e scrittura sovrapposti che non sono affatto supportati da iostreams. Se la situazione ti consente di farne un buon uso, gli iostreams spesso non saranno competitivi.

+2

Per il beneficio di chi non ci lavora di solito, "i18n" di questo post significa "internazionalizzazione". Ci sono 18 caratteri tra "i" e "n" in quella parola, quindi "i18n". –

+0

@kevin: oops, giusto. Grazie per la traduzione. –

+0

* printf non può ancora essere utilizzato per i18n perché la posizione e il tipo delle variabili sono hardcoded. – rpg

1

Uno dei motivi per cui mi piace printf() è che le stringhe di formato stesse possono essere risorse, consentendo così un maggiore controllo esterno sull'output del programma senza forzare la ricompilazione.

Uno dei motivi per cui Cout() mi piace è la velocità non elaborata.

Nella mia esperienza, questo tende ad essere un problema abbastanza religioso.

4

Non si può fare file di I/O asincrono con i flussi ...

1

Uno dei motivi è i18n

string time = "4:32"; 
cout << "the current time is " << time; 
cout << "वर्तमान समय " << time << " है।" 
cout << time << "في الوقت الحالي هو"; 

vs

string format = "the current time is %s"; 
string format = "वर्तमान समय %s है।"; 
string format = "%s في الوقت الحالي هو"; 
printf(format, time); 
1

ci sono tre alternative che hai citato qui: ++ str

  1. C EAMS (ostream, istream, fstream)
  2. C stdio (printf, sprintf fprintf)
  3. i file Windows (ReadFile, WriteFile)

Opzioni 1 & 2 sono indipendente dalla piattaforma. Ciò significa che è possibile compilare il codice per mac, linux o molti altri sistemi operativi. L'opzione 3 è solo per Windows. Ciò significa che non puoi compilarlo per altro che Windows.

Quando si decide tra le opzioni 1 & 2, dipende da come si desidera utilizzarlo. La libreria C è più facile da usare per quanto riguarda le lingue. È un incubo cercare di sostituire il testo con lingue alternative nei flussi, tuttavia è molto più semplice rendere i flussi protetti da thread, tradurre classi più complicate in un formato stampabile ed estendere le funzionalità di streaming.

iostream C++ s 'contro stdio del C è un argomento di grande riscaldata di cui si parla in molti altri luoghi in questo forum, come C++ Streams vs. C-style IO? e in altri luoghi in linea.