Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
EfimKR
55 / 28 / 13
Регистрация: 24.06.2014
Сообщений: 247
Записей в блоге: 1
#1

Что применить "\n" или "endl"? - C++

06.07.2014, 12:12. Просмотров 1582. Ответов 24
Метки нет (Все метки)

Эти две операции похожи - они переходят на новую строку. Но endl очищает буфер, но при этом дольше выполняется.
Так что же лучше применять?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2014, 12:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что применить "\n" или "endl"? (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года "весна", "лето", "осень", "зима" определить...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов),...

Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел
Вставить пробел после каждого символа "." "," "!" или "?", если за этими...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование)
Разработать программу с использованием наследования классов, реализующую...

С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён.
#define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include <math.h> ...

Что Вы понимаете под "абстрактным типом", "абстракцией данных" и "абстрактными операциями"?
А давайте займёмся археологией! И проследим как менялся смысл понятий...

24
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
06.07.2014, 12:18 #2
std::endl - для единообразия. Оптимизировать вывод за счет этого - только по указанию профайлера.
0
dimabubyakin
159 / 120 / 85
Регистрация: 16.10.2013
Сообщений: 1,738
Завершенные тесты: 5
06.07.2014, 12:18 #3
я предпочитаю endl, тут уж на ваш вкус)
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 13:12 #4
Если нужно просто вывести многострочный текст, то удобнее написать
C++
1
"one\ntwo\nthree"
чем
C++
1
"one" << endl << "two" << endl << "three"
И, кстати, поток, насколько я знаю, совершенно спокойно может флашнуться и по "\n".
0
Avazart
Эксперт С++
7680 / 5589 / 543
Регистрация: 10.12.2010
Сообщений: 25,069
Записей в блоге: 17
06.07.2014, 14:06 #5
Tulosba, а выглядит удобнее ли ?

Я пишу так
C++
1
2
3
<< "one" << endl 
<< "two" << endl 
<< "three"
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 14:12 #6
Avazart, могу предложить альтернативный вариант:
C++
1
2
3
<< "one\n"
<< "two\n"
<< "three"
Потому что явно флашить поток наверное все таки не стоит в этом случае.
P.s. Кстати можно и без << во второй, третьей строках.
1
Muhhekaneok
0 / 0 / 0
Регистрация: 30.06.2014
Сообщений: 1
06.07.2014, 15:14 #7
Цитата Сообщение от Tulosba Посмотреть сообщение
флашить поток
Подскажите пожалуйста, что означает данная терминология? Я далеко не программист потому что, поэтому задаю такой вопрос.
0
Avazart
Эксперт С++
7680 / 5589 / 543
Регистрация: 10.12.2010
Сообщений: 25,069
Записей в блоге: 17
06.07.2014, 15:21 #8
Цитата Сообщение от Muhhekaneok Посмотреть сообщение
Подскажите пожалуйста, что означает данная терминология? Я далеко не программист потому что, поэтому задаю такой вопрос.
http://www.cplusplus.com/reference/ostream/ostream/flush/
1
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.07.2014, 15:23 #9
Манипулятор std::endl, помимо того, что добавляет перевод строки в поток, еще и вызывает функцию flush(), которая производит, непосредственно, запись всех еще не записанных данных в поток.
2
GuGo1991
269 / 263 / 146
Регистрация: 02.08.2012
Сообщений: 609
06.07.2014, 16:15 #10
Да и так должно сработать:
C++
1
2
3
std::cout << "one\n"
             "two\n"
             "three";
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 16:16 #11
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Да и так должно сработать:
Цитата Сообщение от Tulosba Посмотреть сообщение
Кстати можно и без << во второй, третьей строках.
собственно
0
GuGo1991
269 / 263 / 146
Регистрация: 02.08.2012
Сообщений: 609
06.07.2014, 16:21 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
P.s. Кстати можно и без << во второй, третьей строках.
Подумал вы не имели ввиду свой вариант
0
fio
10 / 10 / 4
Регистрация: 16.06.2014
Сообщений: 45
06.07.2014, 16:31 #13
endl работает дольше, поэтому его не стоит применять в программах, выводящих много строк и ограниченных по времени выполнения. А ещё набор "\n" требует меньшего количества нажатий на клавиатуре
Впрочем, если речь идёт о скорости, лучше вообще применять сstdio вместо iostream.
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
06.07.2014, 18:21 #14
C++
1
   (std::cout << "one" << std::cout.widen('\n') << "two" << std::cout.widen('\n') << "three").flush() ;
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 19:41 #15
Croessmah, какую цель ты преследуешь этим кодом?
C++
1
std::cout.widen('\n')
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
06.07.2014, 19:57 #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Croessmah, какую цель ты преследуешь этим кодом?
преобразование к внутреннему представлению, например, если используется нестандартная локаль со своим представлением и своим фацетом ctype. Хотя, наверное, при "\n" тоже будет преобразовано в операторе, но фиг его знает.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 21:25 #17
Цитата Сообщение от Croessmah Посмотреть сообщение
например, если используется нестандартная локаль со своим представлением и своим фацетом ctype.
Т.е. допускаешь такой вариант, что "\n" при выводе в поток выполнит не перевод строки, а что-то другое?
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
06.07.2014, 21:51 #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. допускаешь такой вариант, что "\n" при выводе в поток выполнит не перевод строки, а что-то другое?
Например вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <locale>
 
 
class MyFacet : public std::ctype<char>
{
protected:
   char_type do_widen (char c) const {
      return 'X' ;
   }
} ;
 
 
int main() {
   std::cout.imbue ( std::locale ( std::cout.getloc() , new MyFacet ) ) ;
   std::cout << std::cout.widen('\n') ;
   std::cout << '\n' ;
}
учитывается поведение для установленной локали.

Добавлено через 6 минут
Так же и манипулятор endl - выводит с помощью widen интернационализированный символ перевода строки.
Другими словами, widen сделает из переданного символа char символ char_type.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 21:55 #19
Croessmah, так это из-за widen выводится Х, а не наоборот. "Голая" версия нормально переводит строку и по '\n'.
Кстати, почему-то gcc выводит только один Х:
http://ideone.com/T3f5gS
А студия - два.
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,925
Записей в блоге: 3
Завершенные тесты: 1
06.07.2014, 22:22 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
"Голая" версия нормально переводит строку и по '\n'.
"Голая" версия не учитывает моих пожеланий
Цитата Сообщение от Tulosba Посмотреть сообщение
Кстати, почему-то gcc выводит только один Х:
Скорее всего оптимизация при выводе, и используется интервальная версия do_widen:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyFacet : public std::ctype<char>
{
public:
   char_type widen ( char c ) const {
      return this->do_widen(c) ;
   }
protected:
   char_type do_widen (char c) const {
      return (c=='\n'?'X':c) ;
   }
   const char* do_widen (const char* low, const char* high, char_type* to) const {
      for ( ; low != high ; ++low , ++to )
      if ( *low == '\n' )
         *to = 'X' ;
      else
         *to = *low ;
      return high ;
   }
} ;
2
06.07.2014, 22:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2014, 22:22
Привет! Вот еще темы с решениями:

Visual Studio не читает операторы, что начинаются на "glu" ("gluBuild2DMipmaps", "gluPerspective")
Данный код должен выводить на экран кубик который должен вращаться, но возникла...

Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть малой буквой, цифрой или одним из знаков "+", "-", "*".
Дан текст, хранящийся в текстовом файле f, каждый символ которого может быть...

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье"
Написать программу, которая запрашивает у пользователя номер дня недели и...

Определить, какая из точек "В" или "С" расположены ближе к точке "А".
На оси Ох расположены 3 точки А, В и С. Определить, какая из точек &quot;В&quot; или &quot;С&quot;...


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

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

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