Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Потоки.  (Прочитано 6779 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Yolen
Гость
« : 30-08-2004 23:15 » 

У меня вопросы:
1) то что записывается в этот поток мгновенно отображается на устройстве, которое связано с ним или нет.
2) в доке я прочитал, что endl пишет в поток "\n", и выполняет flush(), который в свою очередь должен вывести содержимое потока на устройство, но оно (содержимое) выведется и без flush(), тогда в чем разница этих двух строк:
std::cout<<"Hello World!\n";
std::cout<<"Hello World!"<<std::endl;
На выходе будет один и тот же "Hello World!", а каретка будет на следующей строке.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 31-08-2004 06:54 » 

Не понял Я лично мало понял из вопроса в чем вопрос состоит....

Будь добр, Yolen, потрудись поговорить не телепатически  Ага
Записан

А птичку нашу прошу не обижать!!!
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 31-08-2004 06:57 » 

Цитата: Yolen
У меня вопросы:
1) то что записывается в этот поток мгновенно отображается на устройстве, которое связано с ним или нет.

Нет! не мгновенно. Устройства вывода могут быть медленными, поэтому организовывается буфер. flush - выталкивает все из буфера
Цитата

2) в доке я прочитал, что endl пишет в поток "\n", и выполняет flush(), который в свою очередь должен вывести содержимое потока на устройство, но оно (содержимое) выведется и без flush(), тогда в чем разница этих двух строк:
std::cout<<"Hello World!\n";
std::cout<<"Hello World!"<<std::endl;
На выходе будет один и тот же "Hello World!", а каретка будет на следующей строке.

По сути дела разницы никакой. Результат один и тотже
если посмотреть код, мне кажется, будет одинаков.[/quote]
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Alf
Гость
« Ответ #3 : 31-08-2004 07:48 » 

Цитата: Yolen
У меня вопросы:
1) то что записывается в этот поток мгновенно отображается на устройстве, которое связано с ним или нет.

Как правило, не мгновенно.

Эффективнее обмениваться с внешним устройством не посимвольно (побайтово), а достаточно большими блоками за один раз. Поэтому для вывода в файл в оперативной памяти резервируется буфер, и по мере его заполнения содержимое буфера целиком сбрасывается на устройство, после чего буфер очищается и заполняется снова.

Если информация выводится в поток небольшими порциями, может пройти существенное время, пока она физически попадет на внешнее устройство. Ускорить этот процесс, принудительно выводя незаполненный буфер, можно следующими средствами:

- при закрытии файла;

- операцией flush.
Цитата
2) в доке я прочитал, что endl пишет в поток "\n", и выполняет flush(), который в свою очередь должен вывести содержимое потока на устройство, но оно (содержимое) выведется и без flush(), тогда в чем разница этих двух строк:
std::cout<<"Hello World!\n";
std::cout<<"Hello World!"<<std::endl;
На выходе будет один и тот же "Hello World!", а каретка будет на следующей строке.

Разница лишь в том, что во втором случае выводимая строка будет передана на устройство с максимально возможной скоростью, тогда как в первом это может произойти нескоро.
Записан
Yolen
Гость
« Ответ #4 : 31-08-2004 11:16 » 

Огромное спасибо, теперь понятно.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines