Questa è una riscaldata argomento.
Alcune persone preferiscono utilizzare il C++ IO dato che sono sicuri per il tipo (non è possibile avere divergenze tra il tipo dell'oggetto e il tipo specificato nella stringa di formato) e fluiscono più naturalmente con il resto del C++ modo di codifica.
Tuttavia, vi sono anche argomenti per le funzioni C IO (i miei preferiti personali). Alcuni di essi sono:
- Si integrano più facilmente con localizzazione, come l'intera stringa di localizzare non è rotto in stringhe più piccole, e con qualche implementazione localizzatore possono riordinare l'ordine del valore inserito, spostarli in la stringa, ...
- È possibile visualizzare direttamente il formato del testo che verrà scritto (questo può essere molto difficile con gli operatori di streaming).
- Poiché non c'è alcuna inlining e solo una istanza della funzione
printf
, il codice generato è più piccolo (questo può essere importante nell'ambiente embedded).
- Più veloce della funzione C++ in alcune implementazioni.
Personalmente, non considererei una cattiva pratica utilizzare il flusso C in codice C++. Some organisations consiglia anche di usarli su flusso C++. Quello che considererei uno stile negativo è quello di utilizzare entrambi nello stesso progetto. La coerenza è la chiave qui penso.
Come altri hanno notato, in un tempo relativamente grande progetto, si sarebbe probabilmente non usarli direttamente, ma si usa un set di funzione wrapper (o classi), che sarebbe meglio si adattano al vostro standard di codifica, e la vostra bisogni (localizzazione, tipo sicurezza, ...). Puoi utilizzare l'una o l'altra interfaccia IO per implementare questa interfaccia di livello superiore, ma probabilmente ne userai solo una.
Edit: l'aggiunta di alcune informazioni circa il vantaggio della funzione di famiglia printf
formattazione relative alla localizzazione. Si prega di notare che tali informazioni sono valide solo per alcune implementazioni.
È possibile utilizzare %m$
anziché %
per fare riferimento a un parametro per indice anziché a un riferimento sequenziale. Questo può essere usato per riordinare i valori nella stringa formattata. Il seguente programma scriverà Hello World!
sullo standard output.
#include <stdio.h>
int main() {
printf("%2$s %1$s\n", "World!", "Hello");
return 0;
}
Considerate tradurre questo codice C++:
if (nb_files_deleted == 1)
stream << "One file ";
else
stream << nb_file_deleted << " files ";
stream << removed from directory \"" << directory << "\"\n";
Questo può essere davvero difficile. Con printf
(e una libreria come gettext
per gestire la localizzazione), il codice non è mescolato con la stringa. Possiamo quindi passare la stringa al team di localizzazione e non sarà necessario aggiornare il codice se ci sono casi particolari in alcune lingue (in alcune lingue, se il conteggio dell'oggetto è 0, si usa una forma plurale, in un'altra lingua, ci sono tre forme una per singolare, una quando ci sono due oggetti e una forma plurale, ...).
printf (ngettext ("One file removed from directory \"%2$s\"",
"%1$d files removed from directory \"%2$s\"",
n),
n, dir);
+1 per il punto di localizzazione. Ma come riordini i valori in printf? –
Ho aggiornato il mio post per spiegare come riordinare i valori in 'printf' (suggerimento:'% m $ '). –
Grazie per l'aggiornamento. Se potessi, invierei ancora una volta. –