Многие книги C ++ содержат пример кода, подобного этому ...
std::cout << "Test line" << std::endl;
... так что я всегда так делал. Но я видел много кода от таких разработчиков:
std::cout << "Test line\n";
Есть ли техническая причина, чтобы отдавать предпочтение одному над другим, или это просто вопрос стиля кодирования?
c++
coding-style
iostream
c++-faq
Главный Компьютерщик
источник
источник
'\n'
.Ответы:
Различные символы конца строки не имеют значения, при условии, что файл открыт в текстовом режиме, что вы и получите, если не спросите двоичный файл. Скомпилированная программа выпишет правильную вещь для системы, для которой скомпилировано.
Единственное отличие состоит в том, что
std::endl
очищает выходной буфер, а'\n'
не очищает . Если вы не хотите, чтобы буфер часто очищался, используйте'\n'
. Если вы это сделаете (например, если вы хотите получить все выходные данные, а программа работает нестабильно), используйтеstd::endl
.источник
::std::cerr
вместо,::std::cout
поскольку он небуферизован и сбрасывается при каждой операции вывода.stderr
за ошибки». Скорее, это для внеполосных диагностических сообщений, если хотите. Должна быть возможность говорить./prog > file
и хранить только истинную полезную нагрузку программы, но программе может потребоваться выводить гораздо больше информации о состоянии, даже при обычном взаимодействии.Разница может быть проиллюстрирована следующим:
эквивалентно
Так,
std::endl
если вы хотите принудительно произвести немедленный сброс к выходу.\n
если вы беспокоитесь о производительности (что, вероятно, не так, если вы используете<<
оператор).Я использую
\n
на большинстве линий.Затем используйте
std::endl
в конце абзаца (но это просто привычка и обычно не требуется).В отличие от других утверждений,
\n
символ отображается в правильной последовательности конца строки на платформе, только если поток идет в файл (std::cin
иstd::cout
является специальным, но все же файлом (или файловым)).источник
cout
она привязана к томуcin
, что означает, что если вы читаете вводcin
,cout
сначала будет сброшен ввод . Но если вы хотите отобразить индикатор выполнения или что-то без чтенияcin
, тогда, конечно, очистка полезна.operator<<
не работает, или какую альтернативу использовать для производительности? Пожалуйста, укажите мне на материал, чтобы понять это дальше.sync_with_stdio(false)
и не сбрасывать вывод постоянно. Позвольте библиотеке решить, когда это сделать. stackoverflow.com/a/1926432/14065sync_with_stdio
делает iostreams такими же быстрыми, как stdio. Это неМогут быть проблемы с производительностью,
std::endl
вызывает сброс потока вывода.источник
Там есть еще один вызов функции, если вы собираетесь использовать
std::endl
а) звонит оператору
<<
один раз.б) звонит оператору
<<
дважды.источник
std::cout << "Hello" << "\n";
?<<
будут равны 2 и в случае a , поэтому я бы не стал утверждать, что один или два<<
(или два вызова функции в целом) будут Разница между\n
иendl
.Я вспомнил, прочитав об этом в стандарте, так что здесь идет:
См. Стандарт C11, который определяет, как ведут себя стандартные потоки, так как программы на C ++ взаимодействуют с CRT, стандарт C11 должен здесь определять политику очистки.
Это означает, что
std::cout
иstd::cin
полностью буферизуется, если и только если они ссылаются на неинтерактивное устройство. Другими словами, если stdout подключен к терминалу, то нет различий в поведении.Однако, если
std::cout.sync_with_stdio(false)
вызывается, то'\n'
не вызовет сброс даже для интерактивных устройств. В противном случае'\n'
эквивалентно,std::endl
если только трубопровод для файлов: c ++ ref на std :: endl .источник
Они оба напишут соответствующие символы конца строки. В дополнение к этому endl приведет к тому, что буфер будет зафиксирован. Обычно вы не хотите использовать endl при выполнении файлового ввода-вывода, потому что ненужные коммиты могут повлиять на производительность.
источник
Ничего страшного , но endl не будет работать в boost :: lambda .
источник
Если вы используете Qt и
endl
, вы можете случайно получить неверный результат,endl
который даст вам очень удивительные результаты. Смотрите следующий фрагмент кода:Обратите внимание, что я написал
endl
вместоstd::endl
(что было бы правильно), и, очевидно, естьendl
функция, определенная в qtextstream.h (которая является частью QtCore).Использование
"\n"
вместо того, чтобыendl
полностью обходить любые потенциальные проблемы с пространством имен. Это также хороший пример того, почему помещать символы в глобальное пространство имен (как это делает Qt по умолчанию) - плохая идея.источник
using namespace std;
?? :-)using namespace std;
. Это считается плохой практикой. Посмотрите, почему «используется пространство имен std;» считается плохой практикой?У меня всегда была привычка просто использовать std :: endl, потому что это легко увидеть.
источник
std::endl
Манипулятором эквивалентно'\n'
. Ноstd::endl
всегда сбрасывает поток.источник
Если вы намереваетесь запустить свою программу на чем-то другом, кроме вашего ноутбука, никогда не используйте это
endl
утверждение. Особенно, если вы пишете много коротких строк или, как я часто видел, отдельные символы в файле. Известно использованиеendl
для уничтожения сетевых файловых систем, таких как NFS.источник
Со ссылкой Это манипулятор ввода / вывода только для вывода .
std::endl
Вставляет символ новой строки в выходную последовательность os и сбрасывает его, как будто вызывая сos.put(os.widen('\n'))
последующимos.flush()
.Когда использовать:
Этот манипулятор может быть использован для немедленного создания строки вывода ,
например
Также
источник