Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.82
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

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

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

Встретил в одной книге вот такое выражение (дословно):

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

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

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

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

endl - C++
#include <iostream> int main() { using std::cout; using std::endl; unsigned short int Width = 5, Length; Length =...

Манипулятор ws - C++
Собственно вопрос в следующем: может ли кто-то показать, как использовать манипулятор ws. Он, если я правильно понял, должен пробелы...

Определить манипулятор - C++
Что-то часто я тут начал писать... Но тем не менее... Задание определить манипулятор, который игнорирует все запятые и точки до конца...

Собственный манипулятор - C++
Здорова господа! Я пытаюсь создать свой собственный манипулятор, который будет принимать основу числа: десять шестнадцать и два и само...

21
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:20 #2
использует, конечно
0
ftp13
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 100
22.12.2012, 16:22 #3
Сейчас уже пофиг что использовать. Что в лоб что по полбу ... а насчет буферизации спроси гугл больше пользы будет
0
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:23 #4
если тебя конкретно интересует буферизация при использовании плюсовых объектов cout, clog, cerr, то в cout и clog, насколько я помню, буферизация используется, а в cerr -- нет.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7497 / 4613 / 694
Регистрация: 29.11.2010
Сообщений: 12,628
22.12.2012, 16:25 #5
Да, использует.
Дело в том, что endl - перегруженная функция, вызывающая ф-цию flush(), которая сбрасывает буфер и выводит все, что в нем накопилось, на устройство вывода, и дополняющая в конце последовательности символом '\n'.
1
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:27  [ТС] #6
Обяъсните проще, есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7497 / 4613 / 694
Регистрация: 29.11.2010
Сообщений: 12,628
22.12.2012, 16:32 #7
ramybozy, например, если программа занимается обработкой фотографии, и нужно вывести информацию о некоторых её параметрах, без сбрасывания ostream потока, информацию выведет лишь при завершении обработки или ближайшем вызове flush() метода, а с ним во время обращения к std::cout.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 16:42 #9
Цитата Сообщение от ramybozy Посмотреть сообщение
Обяъсните проще, есть ли какая-либо разница между первым и вторым, и если есть, то как это ну почувствовать что ли?
Раз
Два
(Смотрите на вывод).
1
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
22.12.2012, 16:46  [ТС] #10
А с пояснениями, не затруднит вас.
У меня во втором случае необработанное исключение выскакивает.

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

Может быть не стоит так над новичком издеваться, а просто взяли бы и объяснили бы попроще.
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
22.12.2012, 16:48 #11
Цитата Сообщение от ramybozy Посмотреть сообщение
А у вас, diagon, вообще ничего не понятно.
Сначала выводится текст, затем вызывается функция, которая приводит к переполнению стека и аварийному завершению программы. При этом, если выводить через '\n', то ничего вообще не выведется, так как буфер просто не будет сброшен. А вот std::endl буфер сбрасывает.
0
Evg
Эксперт CАвтор FAQ
18375 / 6422 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
22.12.2012, 16:53 #12
Цитата Сообщение от ramybozy Посмотреть сообщение
Может быть не стоит так над новичком издеваться, а просто взяли бы и объяснили бы попроще.
Он имел в виду то, что использование std::endl немедленно освобождает буфер и выводит напечатанный текст на экран. Когда мы делаем печать (какую-нибудь трассировку программы), а затем программа фатально убивается, то в случае с std::endl печать гарантированно (если я правильно понял) отобразится на экране. А с использованием '\n' печать залипнет во внутреннем буфере программы, а в момент аварийного завершения программы уже некому будет её выводить на экран

В том примере в качестве аварийного завершения моделировалось переполнение стека, после чего программа немедленно прибивается операционной системой
2
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,385
Записей в блоге: 2
Завершенные тесты: 1
22.12.2012, 16:54 #13
Цитата Сообщение от ftp13 Посмотреть сообщение
Сейчас уже пофиг что использовать. Что в лоб что по полбу ...
Нет, не пофиг. Иногда даже делают дополнительную буферизацию (т.е. свою реализацию вывода, внутри которой используются стандартные средства вывода) для увеличения скорости вывода.
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 16:56 #14
Цитата Сообщение от diagon Посмотреть сообщение
При этом, если выводить через '\n', то ничего вообще не выведется, так как буфер просто не будет сброшен
А в какой момент буфер будет сброшен, если не использовать endl? Почему это не делается до вызова функции?
0
Evg
Эксперт CАвтор FAQ
18375 / 6422 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
22.12.2012, 16:58 #15
Цитата Сообщение от Schizorb Посмотреть сообщение
А в какой момент буфер будет сброшен, если не использовать endl? Почему это не делается до вызова функции?
Зависит от реализации библиотеки. При переполнении буфера, при завершении программы, при принудительном сбросе буфера программистом
1
22.12.2012, 16:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 16:58
Привет! Вот еще темы с ответами:

Можно ли заменить \n на endl ? - C++
Есть два рабочих кода.Я экспериментировал с ними в одном кодк где оператор count, &quot;endl&quot; можно заменить \n. Но в коде где функция printf...

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

`endl' undeclared (first use in this function) - C++
#include &lt;stdio.h&gt; #include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; void main() { double (*pf)(double x); ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.