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á! =]
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/