Newsgroup: it.comp.lang.c++
Titolo: cout e' equivalente a printf("");?

Salve sto scrivedo un CGI ho letto l'altro post e visitato
http://www.papillion.ne.us/~sthomas/cgi_in_c.html
ho visto la libreria ccgi e utilcgi++ che dovrebbe essere solo in C++
ma per inviare dati allo standard output usano entrambe
printf("Content-type: text/html\n\n");
per quello che ho capito un
cout<<"Content-type: text/html\n\n";
dovrebbe essere equivalente, mi sto sbagliando?
esiste un motivo specifico perche' in questo caso si utilizza
printf("Content-type: text/html\n\n");?
qualcuno mi spiega le differenze tra i due, io per evitare problemi di
compatibilita' con altri moduli preferirei usare un cout del C++ che un
printf() del C.
Ringrazio anticipatamente chiunque sappia e voglia rispondermi.
Ciao

ciao,l'unica differenza che posso dirti io è che per usare cout devi
includere l'header "iostream.h" mentre come ben saprai printf è in
"stdio.h",entrabe le funzioni a livello pratico hanno lo stesso effetto.

 "stdio.h",entrabe le funzioni a livello pratico hanno lo stesso effetto.
'cout' non è una funzione.
Max

cout sinceramente lo preferisco per praticità,
perchè con il printf() ti devi fare l'elenco degli oggetti da inserire..
Es: printf("Oggi è il %d di marzo",giorno);
vuoi mettere
cout<<"oggi è il "<<giorno<<" di marzo";


io volevo usare iostream perche' sicuramente standard, su stdio ho dei dubbi
poi sinceramente trovo cout piu' comodo.
Ma sono realmente equivalenti?
Ciao


Pienamente daccordo, se non mi sbaglio (altrmenti corregetemi) questo
succede perche' printf() e' ereditata dal C.
Il mio dubbio era se sono realmente equivalenti, cioe se l'effetto ottenuto
e' esattamente lo stesso.
Ciao e grazie.

"Help" ha scritto

Per quel che ne so sono equivalenti tranne per il fatto che
std::cout.operator<<(T tipo) fa un controllo sul tipo di T,
mentre la printf si affida a cosa mette il programmatore dopo i %
--
Gerolamo

 Ma sono realmente equivalenti?
Se ti riferisci all'output prodotto (supponendo che le variabili utilizzate
siano tipi predefiniti), allora si. La differenza fondamentale è che printf
è una funzione, che accetta un numero variabile di argomenti, ma il cui
controllo in pratica viene lasciato all'utente; cout invece è un'istanza
della classe std::ostream, corrispondente allo standard output, e può
lavorare solamente sulle variabili in cui è stato sovraccaricato l'operatore
"<<". Per farla breve, a printf puoi passare tutte le variabili predefinite
che vuoi, formattarle con gli specificatori di formato, ma non puoi passarle
ad esempio una struct; se invece hai una classe (o una struct, che in
pratica è la stessa cosa) in cui hai definito opportunamente l'operatore
"<<", allora può essere passata a std::cout, o ad un qualunque altro stream
di output.
Ciao,
Cecco


Nel post precedente mi sono dimenticato di dire una cosa: tutta la libreria
del C č compresa nella libreria standard del C++, e gli header sono gli
stessi del C, ma preceduti da una 'c':
#include <stdio.h>    // libreria C
#include <cstdio>     // libreria C++
Ciao,
Cecco

poi sinceramente trovo cout piu' comodo.
Penso che nella tua testa ci sia una piccola confusione...
iostream fa parte dello standard C++
stdio dello standard C
Puoi utilizzare entrambi in un programma C++, ma solo la seconda
in un programma C. Riguardo alla comodità:
io penso che cout sia + comoda ma per l'output formattato
printf è più semplice (IMHO)
--
Lawrence "Rhymes" Oluyede
rhy...@myself.com

 printf() del C.
anche io preferirei cout, ma non per motivi di "compatibilita`" (come ho 
gia` detto i due buffer sono sincronizzati).
L'utilizzo degli iostream standard del C++ permette molta piu` 
flessibilita` che non l'uso delle funzioni ereditate dal C come printf: 
uno degli esempi classici e` la possibilita` di definire gli operatori 
di output anche per le proprie classi in modo da poter scrivere cose del 
tipo:
        Mia_classe prova;
        cout << prova;
cosa che non e` possibile fare con printf. Ovviamente ci sono anche 
molte altre differenze tra cout e printf, ma ad elencarle tutte ne 
verrebbe fuori un libro.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

flessibilita` che non l'uso delle funzioni ereditate dal C come printf:
A me piace molto di piů printf, e se si vuole output un po'
"articolato" la trovo anche piů comoda, ovviamente purtroppo non per
produrre output di tipi non primitivi.
-- 
Marco Barisione (ICQ 84277092)

 Cosa dice lo standard?
Di default sono sicronizzati.
Se si chiama  sync_with_stdio(false)  prima delle operazioni di I/O
diventano non sincronizzati.
        Mauro

"Lawrence Oluyede" ha scritto
:
: Penso che nella tua testa ci sia una piccola confusione...
:
...
: io penso che cout sia + comoda ma per l'output formattato
: printf è più semplice (IMHO)
Non ho capito.
cosa vuol dire che cout e` + comoda ma per l'output formattato?
piu` comoda di che? di printf? perche` printf si usa per l'output
non formattato? ed in quel caso cout sarebbe meno comoda?
Boh ?!?
Se il punto e` quello di visualizzare sullo schermo faccette e
simboli incomprensibili intervallati da fastidiosissimi beep,
ci si riesce 'comodamente' anche con qualche overload di
operator << invocato su cout.
ciao
Massimo

non formattato? ed in quel caso cout sarebbe meno comoda?
ti servirebbe anche un corso di italiano accelerato :)
io ho detto che cout è + comoda ma per l'output formattato preferisco
printf


"Lawrence Oluyede" ha scritto
:
: >Non ho capito.
: >cosa vuol dire che cout e` + comoda ma per l'output formattato?
: >
: >piu` comoda di che? di printf? perche` printf si usa per l'output
: >non formattato? ed in quel caso cout sarebbe meno comoda?
:
: ti servirebbe anche un corso di italiano accelerato :)
:
: io ho detto che cout è + comoda ma per l'output formattato preferisco
: printf
Avevo detto di non avere capito, forse perche` prima del ma ci starebbe
bene una virgola, o forse perche` ritengo cout piu` comoda sempre.
ciao
Massimo

garantisce piu` vantaggi e flessibilita`.
Per non parlare poi della maggiore sicurezza garantita dal controllo
dei tipi. La printf del C pretende la specifica completa del tipo di
parametri usati( se ve ne sono) ed un uso errato di essi può portare
facilmente a comportamenti indefiniti o visualizzazione di dati
errati.
Il Ghenio
---------
// TODO: Place your ass here


Concordo, era per questo temevo di essere costretto ad usa printf().
Grazie a tutti per le informazioni.


Grazie per il mio caso e' inifluente quindi usero' cout.
Grazie ancora ciao.

 produrre output di tipi non primitivi.
e` una questione un po` spinosa. Sono d'accordo con te sul fatto che
        printf("Record numero %d / %d", num, totale);
sia *molto* piu` leggibile di
        cout << "Record numero " << num << " / " << totale;
(e la leggibilita` della prima tende ad aumentare via via che le formule 
sono piu` complesse).
Pero` occorre tenere presente che nella prima non c'e` alcun controllo 
sui tipi e non e` estendibile con i tipi di dato definiti dall'utente: 
questi due difetti mi fanno preferire in definitiva gli stream (che, 
peraltro, hanno molti altri pregi: manipolatori, iteratori, ecc.).
Penso che un ibrido tra le due sarebbe una soluzione migliore, ma 
purtroppo la gestione delle stringhe ereditata dal C non permetteva 
scelte migliori.
In ogni caso penso che la soluzione ottimale sia quella che offrono 
molti linguaggi di scripting; ad esempio in bash avremmo
        echo "Record numero $num / $totale"
Ma purtroppo (??) il C++ non e` un linguaggio di scripting... ;-))


        echo "Record numero $num / $totale"
Per alcune persone (ad esempio Alex Martelli) non č "bello" inserire
le variabili direttamente nelle stringhe come ad esempio si puņ fare
con bash, perl, ruby...


 Quindi di default sono sincronizzati.
???
Non sono abituato a leggere gli standard, ma da quel che capisco
sono sincronizzati solo DOPO che è stata chiamata
sync_with_stdio().
Ma dove è scritto che viene chiamata per default?
--
Gerolamo

Quindi di default sono sincronizzati.
Mi pare che 'sync_with_stdio() sia una di quelle funzioni membro che
restituiscono come valore di ritorno lo stato precedente, quindi
dovrebbe essere proprio come dici tu.


 con bash, perl, ruby...
 
perche`?


 Ma dove è scritto che viene chiamata per default?
lo standard dice che se quella funzione restituisce "true" sono 
sincronizzati. Poi dice anche che la prima volta che la richiami 
restituisce true. Questo significa che la prima volta che richiami la 
funzione gli stream sono sincronizzati, altrimenti avrebbe dovuto 
restituire false; ti e` piu` chiaro ora?


 restituire false; ti e` piu` chiaro ora?
Ah! restituisce lo stato PRECEDENTE! Ho capito giusto?
Modo contorto per dire le cose, comunque... :-)
grazie!
--
Gerolamo

 Modo contorto per dire le cose, comunque... :-)
e` lo "standardese"; ogni tanto mi chiedo come abbia fatto Andrea 
(Ferro) ad imparare il C++ leggendo solo lo standard... ;-)


perche`?
Non aveva spiegato esattamente i motivi ma mi pare che fosse legato
soprattutto alla chiarezza del codice.
