Чем отличается endl от n
Перейти к содержимому

Чем отличается endl от n

  • автор:

C++ кто что использует: \n или endl или \r\n

и почему?
Для написания кроссплатформенных программ.
экивалентно ли «\n» «\r\n» «endl»
Что НУЖНО использовать?
С точки зрения быстродействия, кроссплатформенности, итд?
У кого какие возникали проблемы при переносе программ? (по теме топика)

qwertyqw
04.05.14 18:07:35 MSK
int13h ★★★★★
( 04.05.14 18:09:47 MSK )

MikeDM ★★★★★
( 04.05.14 18:11:03 MSK )

DELIRIUM ☆☆☆☆☆
( 04.05.14 18:13:52 MSK )
Ответ на: комментарий от DELIRIUM 04.05.14 18:13:52 MSK

Да, аналогичен. Но зачем сбрасывать буфер после каждой строки?

no-such-file ★★★★★
( 04.05.14 18:16:49 MSK )

Я ваще с++ не использую. \n.

Deleted
( 04.05.14 18:17:39 MSK )
Ответ на: комментарий от DELIRIUM 04.05.14 18:13:52 MSK

О май год, ещё и std::flush
По поводу буфера — как определяется, когда следует выгружать буфер? По завершению блока <>, или как-то ещё? (Или это сокрыто мраком и решает отдельный компилятор?)

qwertyqw
( 04.05.14 18:20:51 MSK ) автор топика

Ну как что? ApplicationRegistry::getInstance()->platformHelper()->endLine();

no-such-file ★★★★★
( 04.05.14 18:22:43 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:20:51 MSK

прочитал, что буфер выгружаетсся в 2х случаях: при endl-flush и при просто flush. или ещё когда нибудь?
Подразумеваю работу с HDD

qwertyqw
( 04.05.14 18:26:25 MSK ) автор топика
Ответ на: комментарий от no-such-file 04.05.14 18:22:43 MSK

Эмм, а это что такое? Какой-то IP ? или фрейм ворк

qwertyqw
( 04.05.14 18:28:09 MSK ) автор топика
Ответ на: комментарий от qwertyqw 04.05.14 18:26:25 MSK

Когда буфер заполнится. Ваш К.О.

no-such-file ★★★★★
( 04.05.14 18:28:34 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:28:09 MSK

Это тонкий намёк, на то, что не надо такие вещи хардкодить. Нужно брать из конфигурации приложения.

no-such-file ★★★★★
( 04.05.14 18:32:37 MSK )
Ответ на: комментарий от no-such-file 04.05.14 18:28:34 MSK

Да, как-то неподумал, спасибо, Кэп
А по поводу размера буфера (как посмотреть?)- он разный для каждой системы\консоли, или выбирается компилятором/или стандартный для всех систем?
или тоже слишком хардкорно smile.gif

qwertyqw
( 04.05.14 18:37:44 MSK ) автор топика

emulek ★
( 04.05.14 18:39:10 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:20:51 MSK

как определяется, когда следует выгружать буфер? По завершению блока <>, или как-то ещё? (Или это сокрыто мраком и решает отдельный компилятор?)

это зависит от того, ЧТО и КУДА ты выводишь. На первое время могу посоветовать после каждого \n.

emulek ★
( 04.05.14 18:40:57 MSK )
Ответ на: комментарий от qwertyqw 04.05.14 18:26:25 MSK

никогда не делай flush. Система сама сделает когда надо.

emulek ★
( 04.05.14 18:42:11 MSK )
Ответ на: комментарий от emulek 04.05.14 18:42:11 MSK

Ок, всем спасибо, всё понятно

qwertyqw
( 04.05.14 18:54:52 MSK ) автор топика
Ответ на: комментарий от qwertyqw 04.05.14 18:20:51 MSK

printf(«\n») — это fwrite(«\n», 1, 1, stdout) и fflush(stdout).

tailgunner ★★★★★
( 04.05.14 19:02:52 MSK )
Ответ на: комментарий от tailgunner 04.05.14 19:02:52 MSK

$ ./run.sh + cat ./run.sh #!/bin/bash -x cat $0 gcc -x c - int main() < printf("1"); printf("2"); printf("3"); printf("\n"); printf("4"); printf("1"); printf("2"); printf("3"); printf("\n"); fflush(stdout); printf("4"); return 0; >EOF strace -ff -e write ./a.out >/dev/null g++ -x c++ - using namespace std; int main() < coutEOF strace -ff -e write ./a.out >/dev/null + gcc -x c - + strace -ff -e write ./a.out write(1, "123\n4123\n", 9) = 9 write(1, "4", 1) = 1 +++ exited with 0 +++ + g++ -x c++ - + strace -ff -e write ./a.out write(1, "123\n4123\n", 9) = 9 write(1, "4", 1) = 1 +++ exited with 0 +++ 

anonymous
( 04.05.14 19:48:34 MSK )
Ответ на: комментарий от anonymous 04.05.14 19:48:34 MSK

Если хотел что-то сказать — скажи словами.

tailgunner ★★★★★
( 04.05.14 19:56:56 MSK )
Ответ на: комментарий от DELIRIUM 04.05.14 18:13:52 MSK

Лучше кому? Не нужен буфер, есть std::cerr, нужна буферизация, зачем ее сбрасывать после каждой строки?

comp00 ★★★★
( 04.05.14 20:10:32 MSK )
Ответ на: комментарий от tailgunner 04.05.14 19:56:56 MSK

Коллега указал на обман в твоих словах

anonymous
( 04.05.14 20:13:39 MSK )
Ответ на: комментарий от tailgunner 04.05.14 19:56:56 MSK

printf(«\n») — это fwrite(«\n», 1, 1, stdout) и fflush(stdout).

anonymous
( 04.05.14 20:15:38 MSK )
Ответ на: комментарий от anonymous 04.05.14 20:13:39 MSK

Коллега указал на обман в твоих словах

Той коллега запостил длинную невнятную фигню, хотя с тем же успехом мог просто сказать «Ты лжешь». Как сделал другой твой коллега %)

tailgunner ★★★★★
( 04.05.14 20:19:38 MSK )
Последнее исправление: tailgunner 04.05.14 20:20:45 MSK (всего исправлений: 1)

Ответ на: комментарий от no-such-file 04.05.14 18:16:49 MSK

Да, аналогичен. Но зачем сбрасывать буфер после каждой строки?

Если это логгер, то лучше сбрасывать каждую строку.

andreyu ★★★★★
( 05.05.14 13:39:42 MSK )
19 апреля 2015 г.
Ответ на: комментарий от andreyu 05.05.14 13:39:42 MSK

Если это логгер, то лучше сбрасывать каждую строку.

Почему тогда не использовать небуферизованный stderr?

annulen ★★★★★
( 19.04.15 21:39:47 MSK )

Изредка увлекаюсь олимпиадным программированием, так перевод строки с помощью endl может добавить 1-2 секунды на больших массивах данных, при ограничении времени 2 секунды на задачу. Поэтому предпочитаю ‘\n’. А уже перед return’ом в main делаю endl либо flush. Иначе задача слита. Кстати, винде уже практически наплевать ‘\n’ или «\r\n». Так что выгодно юзать’\n’.

Deleted
( 19.04.15 22:21:57 MSK )
Ответ на: комментарий от annulen 19.04.15 21:39:47 MSK

Потому, что это не всегда stderr и не всегда нужен небуферизованый, а флашить бывает к месту.

Чем отличается «\n» от std::endl?

Какого типа std::endl ? Как сделать так, чтобы функция могла принимать endl в качестве аргумента?
Что надо указать в прототипе функции, чтобы можно передавать std::endl в качестве аргумента? Уже 3.

Чем boost::signal отличается от std::function
Чем boost::signal отличается от std::function ?

Ошибка в std::cout
есть следующая задача: -создать класс множество целых чисел. перегрузить операторы для следующих.

Манипулятор std::endl
Добрый день! Манипулятор std::endl — это некая глобальная функция, но почему она пишется без.

7595 / 6418 / 2924
Регистрация: 14.04.2014
Сообщений: 27,936

По сути ничем. Просто «\n» — строка, которая анализируется на общих основаниях, а endl — некая команда.

Отличие \n и endl

Чем отличается \n и endl? И то и другое переносит курсор на следующую строку, так? Тогда в чем разница этих команд? Есть ли случаи, в которых лучше использовать ту или иную команду?

На сколько я понимаю в разных ОС перенос строки разный. endl, думаю, под разные операционки тоже будет подстраиваться в отличии от \n

\n — это так называемая «ескейп последовательность».
повстречав этот символ терминал переведет каретку на строчку вниз,
и влево.

то бишь на начало новой строки.

endl — шаблон функции-манипулятора.

принципиальное различие в том,
что данный манипулятор не только сдвинет каретку на новую строку,
но и зафлюшит буфер стандартного потока вывода.

дело в том, что когда мы отправляем в поток символы,
они не сразу вываливаются на терминал.
поток может содержать внутренний буфер,
в котором символы накапливаются.
и только потом все скопом улетают на терминал.

символ ‘\n’ лишь ещё один символ, который уйдёт в поток.
но не факт, что оттуда сразу на терминал.

endl — перевод строки, плюс все содержимое буфера сразу уйдет на терминал.

Случайные статьи

  • Липкие обьекты
  • CMS MODX не работает форма обратной связи
  • Вывести отмеченные галочки из CheckListBox в memo
  • Создать и заполнить ListView
  • Вызывать функцию через определённый промежуток времени
  • Профессия — программирование микроконтроллеров
  • О правильном составлении ТЗ. Часть 1
  • Как сделать выделение мышью?
  • Как создать скрипт для вывода изображений с превью?
  • Какой яп и ide выбрать для кроссплатформенного программирования?

Кто быстрее: std::endl или «\n»?

До сегодняшнего дня я свято верил, что в потоках std::endl – это всегда правильнее, чем \n . Переносимость, и все такое. Но, увы.

#include #include int main() for (int i = 0; i  1000000; ++i) std::string s(1, 'x'); std::cout   ::endl; > return 0; > 

Компилируем и запускаем:

clang++ -o endl -O3 endl.cpp && time ./endl >rubbish real 0m4.518s user 0m1.080s sys 0m3.311s 
#include #include int main() for (int i = 0; i  1000000; ++i) std::string s(1, 'x'); std::cout   <'\n'; > return 0; > 

Компилируем и запускаем:

clang++ -o endl -O3 endl.cpp && time ./endl >rubbish real 0m0.263s user 0m0.236s sys 0m0.008s 

std::endl всегда flush ит поток, сбрасывая буфера. \n же просто пихает в поток символ начала новой строки, и большинстве случаев это и требуется. А когда надо, можно отдельно вызвать std::flush , один раз.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *