Pergunta
Mais uma vez, meu professor não conseguiu responder à minha pergunta. Eu sabia quem seria capaz de ...
Então, eu nunca aprendi realmente C. em C ++, obviamente eu usaria uma declaração Cout o tempo todo. Em uma tarefa recente, meu professor nos disse para colocar
setbuf( stdout , NULL );
Na parte superior de Main (), a fim de obter uma saída não afiada, permitindo -nos ver a saída corretamente.
Minha pergunta é a seguinte: esta declaração afetará uma declaração cout ou simplesmente uma declaração printf () que eu chamo?
Desde já, obrigado!
Solução
Por padrão, iostreams e stdio são sincronizados. Referência.
Isso não significa que ajustar manualmente o buffer do stdio é uma boa ideia! Você pode querer utilizar std::endl
ou std::flush
(a partir de <ostream>
), o que pode ajudá -lo. por exemplo,
std::cout << "Hello, world!" << std::endl;
ou
std::cout << "Hello, world!\n" << std::flush;
Ambos fazem a mesma coisa. (std::endl
= Imprimir linha de extremidade, depois descarregar.)
Outras dicas
Por padrão, se o stdout ou o cout estiver imprimindo em um console, a saída será buffer de linha. Isso significa que toda nova linha impressa liberará a saída. Você pode chamar explicitamente Flush () sempre que quiser substituir o comportamento, por caso, digamos, a saída será redirecionada para um arquivo e você deseja usar a cauda -F e precisar de determinadas saídas em tempo real.
Como Chris disse, sync_with_stdio deve amarrar o stdout não bosgo com um cout não bosgo (por padrão), mas se tudo o que você está fazendo é usar o cout, em vez de usar o setBuf no stdout, uma opção melhor é usar PubSetBuf no ponteiro devolvido por rdbuf. ou seja:
// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);
Outra função que pode ser interessante de se ver é gravata.
Geralmente, quando é importante ver a saída imediatamente, estamos falando de rotina financeira complexa altamente confiável que deve registrar uma transação até o disco rígido antes de enviá-lo para a contraparte. Ou, (muito mais comum), queremos ver mensagens de depuração, mesmo quando o programa estiver travando.
Como você está estudando, assumirei que você está lidando com o segundo caso. Nesse caso, meu conselho seria usar o Stderr em vez de stdout. É inufrado por padrão e você pode redirecioná -lo separadamente do stdout, colocando sua saída em um só lugar e seu log em outro.