Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:10     Символ '\n' и манипулятор endl #1
Встретил в одной книге вот такое выражение (дословно):

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

Хотелось бы узнать, а нынешняя Windows использует буферизацию или нет?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2012, 16:10     Символ '\n' и манипулятор endl
Посмотрите здесь:

Определить манипулятор C++
endl необъявленный идентификатор C++
C++ endl
Манипулятор ws C++
C++ Что делает endl
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:20     Символ '\n' и манипулятор endl #2
использует, конечно
ftp13
 Аватар для ftp13
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 87
22.12.2012, 16:22     Символ '\n' и манипулятор endl #3
Сейчас уже пофиг что использовать. Что в лоб что по полбу ... а насчет буферизации спроси гугл больше пользы будет
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:23     Символ '\n' и манипулятор endl #4
если тебя конкретно интересует буферизация при использовании плюсовых объектов cout, clog, cerr, то в cout и clog, насколько я помню, буферизация используется, а в cerr -- нет.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
22.12.2012, 16:25     Символ '\n' и манипулятор endl #5
Да, использует.
Дело в том, что endl - перегруженная функция, вызывающая ф-цию flush(), которая сбрасывает буфер и выводит все, что в нем накопилось, на устройство вывода, и дополняющая в конце последовательности символом '\n'.
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:27  [ТС]     Символ '\n' и манипулятор endl #6
Обяъсните проще, есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
22.12.2012, 16:32     Символ '\n' и манипулятор endl #7
ramybozy, например, если программа занимается обработкой фотографии, и нужно вывести информацию о некоторых её параметрах, без сбрасывания ostream потока, информацию выведет лишь при завершении обработки или ближайшем вызове flush() метода, а с ним во время обращения к std::cout.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 16:32     Символ '\n' и манипулятор endl #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;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 16:42     Символ '\n' и манипулятор endl #9
Цитата Сообщение от ramybozy Посмотреть сообщение
Обяъсните проще, есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
Раз
Два
(Смотрите на вывод).
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:46  [ТС]     Символ '\n' и манипулятор endl #10
А с пояснениями, не затруднит вас.
У меня во втором случае необработанное исключение выскакивает.

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

Может быть не стоит так над новичком издеваться, а просто взяли бы и объяснили бы попроще.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 16:48     Символ '\n' и манипулятор endl #11
Цитата Сообщение от ramybozy Посмотреть сообщение
А у вас, diagon, вообще ничего не понятно.
Сначала выводится текст, затем вызывается функция, которая приводит к переполнению стека и аварийному завершению программы. При этом, если выводить через '\n', то ничего вообще не выведется, так как буфер просто не будет сброшен. А вот std::endl буфер сбрасывает.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.12.2012, 16:53     Символ '\n' и манипулятор endl #12
Цитата Сообщение от ramybozy Посмотреть сообщение
Может быть не стоит так над новичком издеваться, а просто взяли бы и объяснили бы попроще.
Он имел в виду то, что использование std::endl немедленно освобождает буфер и выводит напечатанный текст на экран. Когда мы делаем печать (какую-нибудь трассировку программы), а затем программа фатально убивается, то в случае с std::endl печать гарантированно (если я правильно понял) отобразится на экране. А с использованием '\n' печать залипнет во внутреннем буфере программы, а в момент аварийного завершения программы уже некому будет её выводить на экран

В том примере в качестве аварийного завершения моделировалось переполнение стека, после чего программа немедленно прибивается операционной системой
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 16:54     Символ '\n' и манипулятор endl #13
Цитата Сообщение от ftp13 Посмотреть сообщение
Сейчас уже пофиг что использовать. Что в лоб что по полбу ...
Нет, не пофиг. Иногда даже делают дополнительную буферизацию (т.е. свою реализацию вывода, внутри которой используются стандартные средства вывода) для увеличения скорости вывода.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 16:56     Символ '\n' и манипулятор endl #14
Цитата Сообщение от diagon Посмотреть сообщение
При этом, если выводить через '\n', то ничего вообще не выведется, так как буфер просто не будет сброшен
А в какой момент буфер будет сброшен, если не использовать endl? Почему это не делается до вызова функции?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
22.12.2012, 16:58     Символ '\n' и манипулятор endl #15
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl? Почему это не делается до вызова функции?
Зависит от реализации библиотеки. При переполнении буфера, при завершении программы, при принудительном сбросе буфера программистом
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 17:00     Символ '\n' и манипулятор endl #16
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl?
Например, когда он заполнится.
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему это не делается до вызова функции?
Каким образом это сделается, если никто не сбрасывает буфер?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 17:19     Символ '\n' и манипулятор endl #17
Цитата Сообщение от Croessmah Посмотреть сообщение
Каким образом это сделается, если никто не сбрасывает буфер?
Ага, понял, само никак не сделается. Скажем, file.close(); спасло бы в этой ситуации.
Croessmah
22.12.2012, 17:21
  #18

Не по теме:

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

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
22.12.2012, 17:24     Символ '\n' и манипулятор endl #19
Цитата Сообщение от Schizorb Посмотреть сообщение
Ага, понял, само никак не сделается. Скажем, file.close(); спасло бы в этой ситуации.
std::flush() спасло бы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 17:26     Символ '\n' и манипулятор endl
Еще ссылки по теме:

C++ `endl' undeclared (first use in this function)
endl C++
Собственный манипулятор C++

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 17:26     Символ '\n' и манипулятор endl #20
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl?
Там своя атмосфера. Явно не в деструкторах, ведь буфер будет сброшен даже при abort().
Более того.
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
   std::cout << "ololo" << '\n';
   for (;;);
}
gcc тут выводит текст и уходит в бесконечный цикл.
Yandex
Объявления
22.12.2012, 17:26     Символ '\n' и манипулятор endl
Ответ Создать тему
Опции темы

Текущее время: 05:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru