Mi chiedo cosa significhi "migliore"?
Se "migliore" significa che puoi usarlo sia in C che in C++, allora vince facilmente, dato che non puoi usare in C. Questa sarebbe una risposta breve e noiosa, e il Bot di Quora la mangerebbe, quindi assumiamo che tu stia usando C++.
Se "migliore" significa più sicuro, allora vince. The following code will crash (or at least, it’ll perform undefined behaviour):
- short x;
- scanf("%d", &x);
Many modern compilers will warn you about this, but it’s not actually part of the standard to do so. Passerei un puntatore a un numero di 16 bit, e scanf() lo tratterebbe come un numero di 32 bit (beh, sulla maggior parte dell'hardware, ecc, ecc, ecc).
Ci sono una serie di problemi simili con stdio - è abbastanza sicuro se sai davvero cosa stai facendo, ma sorprendentemente pochi grandi programmi C lo usano davvero.
Se "migliore" significa più classicamente orientato agli oggetti, allora stdio probabilmente vince. Everything is encapsulated as a FILE pointer, and one can, sort of, argue that the functions taking FILE* as the first argument are examples of message passing.
- fprintf(f, “This might be a file, or a console!n”);
But equally, iostream has a rich inheritance tree, and allows custom iostream transports to be built by simple inheritance of streambuf, for example. Inoltre, gestisce meglio i nuovi tipi. Nel complesso, quindi, direi che iostream ha il vantaggio qui, anche se la sintassi dell'inseritore non è molto classica.
- out << "Ma allora, anche questo può farlo". << std::endl;
If “better” means quicker to build, it’s stdio for sure. Iostream è una vasta gamma di template, e quelli richiedono molto più tempo per compilare rispetto alle semplici chiamate di funzione.
Se "migliore" significa più veloce... Beh, allora sareste perdonati se pensaste che è destinato ad essere lo stdio semanticamente semplice. E vi sbagliereste, perché vasti tratti di iostream sono una libreria di template, e quindi in gran parte risolti al momento della costruzione. Per qualsiasi cosa anche lontanamente complessa - e certamente qualsiasi cosa che coinvolga tipi personalizzati - iostream è più veloce, poiché rimuove decine di chiamate a funzioni e può specializzare l'inserimento chiamato per il tipo durante la compilazione, lasciando un runtime sorprendentemente stretto. Una volta ho sentito Bjarne Stroustrup spiegarlo, e ha detto che era sorpreso quanto voi probabilmente lo siete ora.
Se "migliore" significa più facile da gestire la formattazione complessa dell'output, stdio vince - così tanto, infatti, che ci sono implementazioni di format-string in giro che si integrano bene con iostream (per esempio, boost::format).
In definitiva, iostream è un vincitore a mani basse - anche se si potrebbe voler aggiungere boost::format o altre librerie come richiesto.