Что такое n в с
Перейти к содержимому

Что такое n в с

  • автор:

Различия между ‘\n’ и std::endl

Я знаю, что endl делает перенос и очищает буфер ( flush ). Но почему-то не вижу разницы, что с endl , что с \n , результат один — отображается Hello, world! Как переписать код так, чтобы увидеть разницу с endl и \n ?

Отслеживать
29k 14 14 золотых знаков 61 61 серебряный знак 119 119 бронзовых знаков
задан 29 мая 2016 в 20:07
1,301 5 5 золотых знаков 21 21 серебряный знак 38 38 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Думаю, что проблема в буферизации вывода.

В C++ потоки ввода и вывода могут быть в одном из трёх состояний: небуферизирован (любой вывод сразу попадает в целевой файл/пайп/на консоль), буферизирован построчно (символы попадают в вывод после окончания каждой строки, исчерпания внутреннего буфера или закрытия потока), и полностью буферизован (символы попадают в вывод лишь после исчерпания внутреннего буфера или закрытия потока).

Майкрософтовская реализация стандартной библиотеки никогда не делает построчную буферизацию (почитайте ответ от Stephan T. Lavavej), имплементации на линуксе обычно делают.

В этом ответе содержится цитата из стандарта (C11 7.21.3 §7):

the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device

(это относится к чистому C). У C++ та же политика, согласно этому ответу:

C++11 27.4.2 [narrow.stream.objects]/3 : The object cout controls output to a stream buffer associated with the object stdout .

Это означает, что если вывод производится на консоль, а не в файл, то вы увидите всегда полную строчку после \n . А вот если вывод перенаправлен, то произойдёт буферизация.

Вот пример. Рассмотрим код:

#include "stdafx.h" #include #include #include int main()

в MSVC 2015. Если запустить программу обыкновенным образом, мы увидим сначала this is , и лишь через 10 секунд SPARTA . А если запустить программу так: a.exe >x.txt , и заглянуть через пару секунд после запуска в файл x.txt , то вы не увидите там ничего до окончания работы программы.

Если заменить «\n» на std::endl , вывод в файл работает так же, как и на консоль.

Обновление: в MSVC 2015 установить буферизацию std::cout можно вручную (идея с благодарностью украдена подсмотрена в этом ответе):

std::cout.sync_with_stdio(false); char mybuf[1024]; std::cout.rdbuf()->pubsetbuf(mybuf, 1024); std::cout  

Этот код выводит текст только после std::endl .

Как работает %[^\n]s?

Верно ли я понимаю, что первый scanf читает поток и останавливается на \n , после чего каждый последующий вызов scanf начинает чтение с этого же символа (\n) и, следовательно, моментально останавливается, тем самым не предлагая пользователю ввести следующие символы в консоль?

  • Вопрос задан более года назад
  • 388 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 1
"I'm here to consult you" © Dogbert

Верно ли я понимаю, что первый scanf читает поток и останавливается на \n , после чего каждый последующий вызов scanf начинает чтение с этого же символа (\n) и, следовательно, моментально останавливается

Понимаешь верно. Вдобавок форматная строка %[^\n]s содержит символ s который никогда не заматчится, потому что %[^\n] останавливается на символе '\n'. Логично было бы заменить её на %[^\n]%*c чтобы работало так, как было задумано.

Ответ написан более года назад
Нравится 1 3 комментария

Qubc

Qubc @Qubc Автор вопроса

Не понял, почему ты написал "никогда не заматчится", если первый scanf читает всю строку, пока не упрётся в \n ?
Разве %[^\n]s не означает читать строку (т.е. последовательность байтов), пока не встретиться \n?
А вот это %[^\n]\n вообще тогда непонятно, как работает.

Что значит %[^\n] ?

Увидел в коде fscanf(f, "%[^\n]\n", line);
Что значит %[^\n] ?

  • Вопрос задан более трёх лет назад
  • 4727 просмотров

Комментировать

Решения вопроса 1

"I'm here to consult you" © Dogbert

"символы до конца строки". Об этом и многом другом можно узнать из man, например linux.die.net/man/3/scanf

Ответ написан более трёх лет назад

Нравится 6 3 комментария

Alex @AlexTalker

То есть модификатор поддерживает регулярные выражения?

@AlexTalker, нет, не значит=) Там все очень ограниченно. en.cppreference.com/w/cpp/io/c/fscanf. В частности, "[set]
matches a non-empty sequence of character from set of characters.
If the first character of the set is ^, then all characters not in the set are matched. If the set begins with ] or ^] then the ] character is also included into the set."

Alex @AlexTalker

Благодарю.Вот о чем мне не говорили, так об этом.

Ответы на вопрос 0

Ваш ответ на вопрос

Войдите, чтобы написать ответ

cpp

  • C++

Насколько хорошая практика использовать обертки над операторами?

  • 1 подписчик
  • 21 час назад
  • 78 просмотров

Что такое n в с

Регистрация: 15.02.2010

Сообщений: 15,709

тогда почему я не могу найти в гугле ответ на свой вопрос?

Странно. на первой же странице гугла по strtok есть ответ.

somewhere else

Участник клуба

Регистрация: 17.07.2008

Сообщений: 1,409

#include int main()

Попробуйте откомпилировать и запустить А вообще это спец-символ перевода строки, на клавиатуре его нет, потому для него создали такой псевдоним \n. К слову есть и другие псевдонимы, как например символ табуляции: \t

PS: Возможно сумма различных ответов в этой теме, все же даст полный ответ ТС-у на его вопрос

"Тяжело в учении, легко в бою" - А.В. Суворов

Страница 2 из 2 Предыдущая

1 2
Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что это за знак и что он значит? Яр|/|| < (^_^) Свободное общение 10 04.07.2010 13:16
Что значит слово батник? СисТемникс Помощь студентам 2 15.06.2010 15:19
Что значит Inc(x)? Vadim123456 Помощь студентам 6 27.04.2010 23:19
что это значит Андрей1992 Помощь студентам 2 25.03.2010 21:04

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

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