С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/43: Рейтинг темы: голосов - 43, средняя оценка - 4.60
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
1

Символ '\n' и манипулятор endl

22.12.2012, 16:10. Показов 8062. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Встретил в одной книге вот такое выражение (дословно):

Если операционная система не использует буферизацию вывода, то между символом новой строки '\n' и манипулятором endl нет никакой разницы.

Хотелось бы узнать, а нынешняя Windows использует буферизацию или нет?
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Блог
22.12.2012, 16:10
Ответы с готовыми решениями:

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

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

endl
Объясните пожалуйста зачем вставлять эту функцию после выводимого потока например:...

endl
#include <iostream> int main() { using std::cout; using std::endl; unsigned short int...

21
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:20 2
использует, конечно
0
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
22.12.2012, 16:22 3
Сейчас уже пофиг что использовать. Что в лоб что по полбу ... а насчет буферизации спроси гугл больше пользы будет
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:23 4
если тебя конкретно интересует буферизация при использовании плюсовых объектов cout, clog, cerr, то в cout и clog, насколько я помню, буферизация используется, а в cerr -- нет.
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.12.2012, 16:25 5
Да, использует.
Дело в том, что endl - перегруженная функция, вызывающая ф-цию flush(), которая сбрасывает буфер и выводит все, что в нем накопилось, на устройство вывода, и дополняющая в конце последовательности символом '\n'.
1
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:27  [ТС] 6
Обяъсните проще, есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.12.2012, 16:32 7
ramybozy, например, если программа занимается обработкой фотографии, и нужно вывести информацию о некоторых её параметрах, без сбрасывания ostream потока, информацию выведет лишь при завершении обработки или ближайшем вызове flush() метода, а с ним во время обращения к std::cout.
1
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,943
Записей в блоге: 1
22.12.2012, 16:32 8
Цитата Сообщение от ramybozy Посмотреть сообщение
есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <fstream>
int main(){
    std::ofstream file("output.txt");
    file<<"m\n";
    while (true) int *f = new int[1000000];
    std::cin.get();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <fstream>
int main(){
    std::ofstream file("output.txt");
    file<<"m"<<std::endl;
    while (true) int *f = new int[1000000];
    std::cin.get();
    return 0;
}
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 16:42 9
Цитата Сообщение от ramybozy Посмотреть сообщение
Обяъсните проще, есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
Раз
Два
(Смотрите на вывод).
1
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:46  [ТС] 10
А с пояснениями, не затруднит вас.
У меня во втором случае необработанное исключение выскакивает.

Добавлено через 3 минуты
А у вас, diagon, вообще ничего не понятно.

Может быть не стоит так над новичком издеваться, а просто взяли бы и объяснили бы попроще.
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 16:48 11
Цитата Сообщение от ramybozy Посмотреть сообщение
А у вас, diagon, вообще ничего не понятно.
Сначала выводится текст, затем вызывается функция, которая приводит к переполнению стека и аварийному завершению программы. При этом, если выводить через '\n', то ничего вообще не выведется, так как буфер просто не будет сброшен. А вот std::endl буфер сбрасывает.
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.12.2012, 16:53 12
Цитата Сообщение от ramybozy Посмотреть сообщение
Может быть не стоит так над новичком издеваться, а просто взяли бы и объяснили бы попроще.
Он имел в виду то, что использование std::endl немедленно освобождает буфер и выводит напечатанный текст на экран. Когда мы делаем печать (какую-нибудь трассировку программы), а затем программа фатально убивается, то в случае с std::endl печать гарантированно (если я правильно понял) отобразится на экране. А с использованием '\n' печать залипнет во внутреннем буфере программы, а в момент аварийного завершения программы уже некому будет её выводить на экран

В том примере в качестве аварийного завершения моделировалось переполнение стека, после чего программа немедленно прибивается операционной системой
2
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.12.2012, 16:54 13
Цитата Сообщение от ftp13 Посмотреть сообщение
Сейчас уже пофиг что использовать. Что в лоб что по полбу ...
Нет, не пофиг. Иногда даже делают дополнительную буферизацию (т.е. свою реализацию вывода, внутри которой используются стандартные средства вывода) для увеличения скорости вывода.
0
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
22.12.2012, 16:56 14
Цитата Сообщение от diagon Посмотреть сообщение
При этом, если выводить через '\n', то ничего вообще не выведется, так как буфер просто не будет сброшен
А в какой момент буфер будет сброшен, если не использовать endl? Почему это не делается до вызова функции?
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.12.2012, 16:58 15
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl? Почему это не делается до вызова функции?
Зависит от реализации библиотеки. При переполнении буфера, при завершении программы, при принудительном сбросе буфера программистом
1
Неэпический
18112 / 10699 / 2062
Регистрация: 27.09.2012
Сообщений: 26,943
Записей в блоге: 1
22.12.2012, 17:00 16
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl?
Например, когда он заполнится.
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему это не делается до вызова функции?
Каким образом это сделается, если никто не сбрасывает буфер?
1
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
22.12.2012, 17:19 17
Цитата Сообщение от Croessmah Посмотреть сообщение
Каким образом это сделается, если никто не сбрасывает буфер?
Ага, понял, само никак не сделается. Скажем, file.close(); спасло бы в этой ситуации.
0
Croessmah
22.12.2012, 17:21
  #18

Не по теме:

Цитата Сообщение от Schizorb Посмотреть сообщение
Скажем, file.close(); спасло бы в этой ситуации.
А если дальше с файлом необходимо работать?

0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.12.2012, 17:24 19
Цитата Сообщение от Schizorb Посмотреть сообщение
Ага, понял, само никак не сделается. Скажем, file.close(); спасло бы в этой ситуации.
std::flush() спасло бы
1
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 17:26 20
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl?
Там своя атмосфера. Явно не в деструкторах, ведь буфер будет сброшен даже при abort().
Более того.
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
   std::cout << "ololo" << '\n';
   for (;;);
}
gcc тут выводит текст и уходит в бесконечный цикл.
1
22.12.2012, 17:26
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
22.12.2012, 17:26
Помогаю со студенческими работами здесь

Можно ли заменить \n на endl ?
Есть два рабочих кода.Я экспериментировал с ними в одном кодк где оператор count, &quot;endl&quot; можно...

Что делает endl
Код типа cout &lt;&lt; &quot;blahblahblah&quot; &lt;&lt; endl зачем там endl, вроде и без него все нормально работает

`endl' undeclared (first use in this function)
#include &lt;stdio.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; void main() {...

endl необъявленный идентификатор
Почему компилятор использует endl, как переменную, а не переход на новую строку?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru