\n ou endl? (C++)

Bom… Sou iniciante em C++ e vi alguns exemplos onde é usado o endl ao invés do \n.
Alguém pode me explicar a diferença?

cout << "Ola\n"; cout << "Ola" << endl;
Caso haja diferença, em que situações devo usar um ou outro?
Agradeço desde já! =]

O endl é um manipulador de stream que faz “pular a linha” e força o flush do buffer.

Olha o que o Google diz sobre o assunto:
http://stackoverflow.com/questions/4026394/c-difference-between-endl-and-n
http://www.cplusplus.com/forum/beginner/7350/

[]'s

É uma boa também consultar algum site de referência, como esse aqui:
http://www.cplusplus.com/reference/iostream/manipulators/endl/

Pelo que eu entendi o endl dá um flush no buffer. (exatamente como o david respondeu)
Mas o cout por si só já não faz isso?
Eu gostaria, se possível, para melhor esclarecimento, um exemplo onde o uso de \n faz diferença do uso de endl.

Agradeço a atenção! =]

Os streams fazem isso apenas quando são fechados, ou quando um comando para flush (como flush() ou endl) é explicitamente chamado.

Se você usar o \n, e estiver escrevendo um arquivo de log, por exemplo, corre o risco da sua aplicação abortar sem que a linha de log seja escrita.
Afinal, até que o flush() seja dado, o texto estará apenas na memória do stream.

Então vc usa apenas endl, Vini?
Mesmo pra um cout << "Hello world!" << endl;
?
Não há diferença de performance?
Usar o \n não exigiria menos?

[quote=cake]Então vc usa apenas endl, Vini?
Mesmo pra um cout << "Hello world!" << endl;
?
Não há diferença de performance?
Usar o \n não exigiria menos?[/quote]

olha, faça um teste.

cout << “teste1\n”;
cout << “teste1\n”;
cout << “teste1\n”;

essas linhas não serão impressas até o endl ser executado… é aquilo que o pessoal explicou acima.

cout << "teste1\n"; cout << "teste1\n"; cout << "teste1\n";
Aqui imprimiu as 3 linhas… Não era pra imprimir?

Eu costumo a usar só o endl sim.

Quanto à performance, nunca me preocupei com isso. Dificilmente a impressão de texto no console será um gargalo na aplicação.

Você fez o teste usando o depurador? Olhe linha a linha o que ocorre no console.

Mas algumas implementações podem fazer flush na saída padrão com mais frequência.

[quote=cake]cout << "teste1\n"; cout << "teste1\n"; cout << "teste1\n";
Aqui imprimiu as 3 linhas… Não era pra imprimir?[/quote]

Não era não. Qual compilador está usando?

Fiz um teste aqui e o mingw faz flush no buffer automaticamente. A coleção gnu( o gcc em versões diferentes do win não faz).

No Microsoft C++, sair do programa normalmente gera um “flush” implícito na saída padrão. Isso não é um comportamento padrão, mas suspeito que seja assim porque o pessoal de Microsoft deve ter recebido um monte de reclamações antes (tradução: aumento das despesas com suporte). Eles preferem ficar fora do padrão que terem mais gastos com suporte.

No g++ no Linux, sair do programa não gera esse “flush” implícito, e muitas vezes este simples programa:

#include <iostream>
int main (int argc, char*argv[]) {
    cout << "Hello, world!\n";
}

não imprime nada se for compilado com o g++, e imprime “Hello, world” se você compilá-lo com o Microsoft C++.

[quote=entanglement]No Microsoft C++, sair do programa normalmente gera um “flush” implícito na saída padrão. Isso não é um comportamento padrão, mas suspeito que seja assim porque o pessoal de Microsoft deve ter recebido um monte de reclamações antes (tradução: aumento das despesas com suporte). Eles preferem ficar fora do padrão que terem mais gastos com suporte.

No g++ no Linux, sair do programa não gera esse “flush” implícito, e muitas vezes este simples programa:

#include <iostream>
int main (int argc, char*argv[]) {
    cout << "Hello, world!\n";
}

não imprime nada se for compilado com o g++, e imprime “Hello, world” se você compilá-lo com o Microsoft C++.

[/quote]

eu testei com o mingw32 aqui e imprimiu também. Na minha casa como uso linux, eu desconhecia esse comportamento.

cout << "teste1\n"; cout << "teste1\n"; cout << "teste1\n";
Uso o Code::Blocks, gente.
Executei linha a linha e ele dá o flush a cada cout mesmo sem o endl.

Esticando um pouquinho o tópico, se me permitem, li que o endl chama o caractere de nova linha padrão do sistema, visto alguns sistemas não usam o \n. Então o endl tb garantiria portabilidade.
Alguém pode confirmar isso?

[quote=cake]cout << "teste1\n"; cout << "teste1\n"; cout << "teste1\n";
Uso o Code::Blocks, gente.
Executei linha a linha e ele dá o flush a cada cout mesmo sem o endl.

Esticando um pouquinho o tópico, se me permitem, li que o endl chama o caractere de nova linha padrão do sistema, visto alguns sistemas não usam o \n. Então o endl tb garantiria portabilidade.
Alguém pode confirmar isso?[/quote]

melhor usar o endl, porque em systemas posix o buffer não é liberado com isso. Na minha máquina não sai nada. Se você usar garante a portabilidade, até porque o próprio namespace já diz:

std = standard

De certo modo, o std::endl está para o C++ assim como o println está para o Java - ele gera o \r\n se estiver no Windows ou o \n se estiver no Unix/Linux.

É um fato pouco conhecido que escrever printf ("\n") ou cout << “\n” na verdade gera um “\r\n” se você estiver no Windows (onde há diferença entre o modo “cooked” e o modo “raw” para escrever em arquivos. O modo “raw” simplesmente não faz essa conversão implícita; o modo “cooked” (normalmente habilitado pela opção não-padrão do fopen chamada “t” ou desabilitado pela opção não-padrão ios_base::binary faz essa conversão implícita.

http://www.cplusplus.com/reference/iostream/ios_base/openmode/