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 , один раз.