Domanda

Ancora una volta, il mio insegnante non è stato in grado di rispondere alla mia domanda. Sapevo chi potrebbe essere in grado di ...

Quindi, non ho mai davvero imparato C. In C ++, ovviamente, avrei sempre usato un'istruzione cout. In un recente incarico, il mio insegnante ci ha detto di assicurarci di mettere

setbuf( stdout , NULL );

nella parte superiore di main () per ottenere un output senza buffer, permettendoci così di vedere correttamente l'output.

La mia domanda è questa: questa dichiarazione influenzerà un'istruzione cout o semplicemente un'istruzione printf () che chiamo?

Grazie in anticipo!

È stato utile?

Soluzione

Per impostazione predefinita, iostreams e stdio sono sincronizzati. Riferimento.

Questo non significa che la regolazione manuale del buffering stdio sia una buona idea! Potresti voler utilizzare std::endl o std::flush (da <ostream>), che potrebbe aiutarti. per es.,

std::cout << "Hello, world!" << std::endl;

o

std::cout << "Hello, world!\n" << std::flush;

Entrambi fanno la stessa cosa. ( <=> = stampa fine, quindi a filo.)

Altri suggerimenti

Per impostazione predefinita, se stdout o cout stanno stampando su una console, l'output è bufferizzato in linea. Ciò significa che ogni nuova riga stampata scaricherà l'output. Puoi chiamare esplicitamente flush () ogni volta che vuoi sovrascrivere il comportamento per ogni evenienza, l'output verrà reindirizzato a un file e vuoi usare tail -f e hai bisogno di determinati output in tempo reale.

Come ha detto Chris, sync_with_stdio dovrebbe legare lo stdout senza buffer con un couff senza buffer (per impostazione predefinita), ma se tutto quello che stai facendo è usare cout, invece di usare setbuf su stdout, un'opzione migliore è usare pubsetbuf sul puntatore restituito da rdbuf . vale a dire:

// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);

Un'altra funzione che può essere interessante da guardare è tie .

Di solito, quando è importante vedere immediatamente l'output, stiamo parlando di una complessa routine finanziaria altamente affidabile che deve registrare una transazione fino al disco rigido prima di inviarla effettivamente alla controparte. Oppure, (caso molto più comune) vogliamo vedere i messaggi di debug anche quando il programma si blocca.

Dato che stai studiando, suppongo che tu abbia a che fare con il secondo caso. In tal caso, il mio consiglio sarebbe di usare stderr piuttosto che stdout. È senza buffer per impostazione predefinita e puoi reindirizzarlo separatamente da stdout, mettendo l'output in un posto e la registrazione in un altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top