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

Ввод/вывод баг или нет? - C++

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 21:24     Ввод/вывод баг или нет? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iterator>
#include <string>
using namespace std;
 
ostream_iterator<string> oo(cout);
istream_iterator<string> ii(cin);
 
int main()
{
    *oo = "Hello, ";
    ++oo;
    *oo = "word!\n"; // Hello, world! 
 
    string s1 = *ii; // Greed
    ++ii;
    string s2 = *ii; // you
    cout << s1 <<  ' ' << s2 << '\n';
 
    return 0;
}
Результат выполнение этой программы:
Bash
1
2
3
4
5
ilyuha21st@coldshoot:~/projects$ ./prog
Greed you
Hello, word!
Greed you
ilyuha21st@coldshoot:~/projects$
Почему вначале вызывается объект std::cin вместо std::cout на который указывает итератор?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
28.01.2013, 21:29     Ввод/вывод баг или нет? #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
Почему вначале вызывается объект std::cin вместо std::cout на который указывает итератор?
поменяйте
C++
1
2
ostream_iterator<string> oo(cout);
istream_iterator<string> ii(cin);
на
C++
1
2
ostream_iterator<string> oo(cout<<"My");
istream_iterator<string> ii(cin);
и посмотрите так это или нет.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 21:40  [ТС]     Ввод/вывод баг или нет? #3
Цитата Сообщение от Croessmah Посмотреть сообщение
и посмотрите так это или нет.
Да действительно, сначала отображается слово "My", а потом запрос на ввод строки пользователю. Но отсюда вытекает следующий вопрос: "Почему тогда в начале не отображается значение итератора оо?"
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,587
Записей в блоге: 17
28.01.2013, 21:51     Ввод/вывод баг или нет? #4
Мда интересный момент...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
28.01.2013, 22:52     Ввод/вывод баг или нет? #5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Но отсюда вытекает следующий вопрос: "Почему тогда в начале не отображается значение итератора оо?"
А как, по-вашему, должно быть?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 23:36  [ТС]     Ввод/вывод баг или нет? #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А как, по-вашему, должно быть?
Сначала должно вывести на консоль Hello world, а затем запрос на ввод.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
28.01.2013, 23:45     Ввод/вывод баг или нет? #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Сначала должно вывести на консоль Hello world, а затем запрос на ввод.
чтобы было понятнее введите первый раз не
Greed you
а
Greed
и посмотрите разницу
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,587
Записей в блоге: 17
29.01.2013, 00:46     Ввод/вывод баг или нет? #8
Ну не знаю.. Builder та же фигня, ща проверю в VC++

Добавлено через 13 минут
В VC++ также работает...
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:02  [ТС]     Ввод/вывод баг или нет? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
чтобы было понятнее введите первый раз не
Greed you
а
Greed
и посмотрите разницу
Я сразу опробовал все варианты. Вопрос не в том какая разница, а в том, почему именно сначала срабатывает объект cin, до обоих объектов cout (а ведь они оба в коде стоят впереди).

Добавлено через 6 минут
Пс. единственно, что может прийти в голову, так это то, что очередь для обоих потоков input и output одна. Т.е. с каждым инкриментированием итератора указывающем на cout, сразу же и инкриментируется итератор указывающий на cin. Но эта догма порождает следующий вопрос: "Как тогда программа "знает" что присутствует объект output, до его инициализации?"

Добавлено через 6 минут
А вот и развязка, компилятор знает что есть
C++
1
оба
объекта, потому что было определение и объявлением до функции main. Следующий код демонстративно показывает разницу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iterator>
#include <string>
using namespace std;
 
int main()
{
    ostream_iterator<string> oo(cout);
    *oo = "Hello, ";
    ++oo;
    *oo = "word!\n"; // Hello, world! 
 
    istream_iterator<string> ii(cin);
    string s1 = *ii; // Greed
    ++ii;
    string s2 = *ii; // you
    cout << s1 <<  ' ' << s2 << '\n';
 
    return 0;
}
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.01.2013, 01:05     Ввод/вывод баг или нет? #10
Когда ты создаешь объект инпут-итератора, то конструктор ждет поток. Поэтому так и работает. Перенеси создание инпут-итератора после работы с oo и будет работать, как ожидалось.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:16  [ТС]     Ввод/вывод баг или нет? #11
Цитата Сообщение от Vourhey Посмотреть сообщение
Когда ты создаешь объект инпут-итератора, то конструктор ждет поток. Поэтому так и работает. Перенеси создание инпут-итератора после работы с oo и будет работать, как ожидалось.
Так вот в чём всё дело. В этом конструкторе, а я там уже глупостей наговорил по поводу единой очереди выполнения. Спасибо, теперь всё стало ясно.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.01.2013, 01:37     Ввод/вывод баг или нет? #12
И, да, ты можешь сделать как-нибудь так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ostream_iterator<string> oo(cout);
istream_iterator<string> ii(cin);
 
int main()
{
    *oo = "Hello, ";
    ++oo;
    *oo = "world!\n"; // Hello, world! 
 
    cout<<*ii<<endl;
    
    return 0;
}
Чтобы дополнительно понять, "зачем он так делает".
Не компилил, но должно работать.

Добавлено через 9 минут
Цитата Сообщение от xtorne21st Посмотреть сообщение
В этом конструкторе
Да. Он инициализирует "внутреннее" значение данными из потока в конструкторе в данном случае. А на * - возвращает уже считанное предварительно значение.

Добавлено через 9 минут

Не по теме:

Ну же... уже заждался...

xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:52  [ТС]     Ввод/вывод баг или нет? #13
Цитата Сообщение от Vourhey Посмотреть сообщение
И, да, ты можешь сделать как-нибудь так:
Всё верно, как в первом случаи, сначала ждёт ввода с клавиатуры, затемы выводит значения итератора oo, а затем отображает результат итератора ii
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 01:57     Ввод/вывод баг или нет?
Еще ссылки по теме:

C++ std::regex : баг на сайте или баг компилятора?
Форматный ввод/вывод: имя, второе имя или инициал, фамилия C++
C++ Поменять консольный ввод-вывод на файловый ввод-вывод

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

Или воспользуйтесь поиском по форуму:
Vourhey
29.01.2013, 01:57     Ввод/вывод баг или нет?
  #14

Не по теме:

xtorne21st, "заждался" это я не про написанный пример, не обращай внимания.

Yandex
Объявления
29.01.2013, 01:57     Ввод/вывод баг или нет?
Ответ Создать тему
Опции темы

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