Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
xtorne21st
интересующийся
305 / 276 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
1

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

28.01.2013, 21:24. Просмотров 570. Ответов 13
Метки нет (Все метки)

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 на который указывает итератор?
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2013, 21:24
Ответы с готовыми решениями:

std::regex : баг на сайте или баг компилятора?
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через...

Баг asio? или баг TCP стека?
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или...

Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод
Добрый день! Помогите, пожалуйста, с программой. Программа считывает строку с клавиатуры и...

Поменять консольный ввод-вывод на файловый ввод-вывод
вот у меня калькулятор как мне сделать что б числа вводились из файла и результат записывался в...

Форматный ввод/вывод: имя, второе имя или инициал, фамилия
Напишите программу, считывающую имя человека в таком формате: имя, второе имя или инициал, фамилия....

13
Croessmah
++Ͻ
15645 / 8807 / 1689
Регистрация: 27.09.2012
Сообщений: 21,706
Записей в блоге: 2
Завершенные тесты: 2
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);
и посмотрите так это или нет.
1
xtorne21st
интересующийся
305 / 276 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 21:40  [ТС] 3
Цитата Сообщение от Croessmah Посмотреть сообщение
и посмотрите так это или нет.
Да действительно, сначала отображается слово "My", а потом запрос на ввод строки пользователю. Но отсюда вытекает следующий вопрос: "Почему тогда в начале не отображается значение итератора оо?"
1
Avazart
Эксперт С++
7919 / 5740 / 568
Регистрация: 10.12.2010
Сообщений: 26,285
Записей в блоге: 17
28.01.2013, 21:51 4
Мда интересный момент...
0
28.01.2013, 21:51
Croessmah
++Ͻ
15645 / 8807 / 1689
Регистрация: 27.09.2012
Сообщений: 21,706
Записей в блоге: 2
Завершенные тесты: 2
28.01.2013, 22:52 5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Но отсюда вытекает следующий вопрос: "Почему тогда в начале не отображается значение итератора оо?"
А как, по-вашему, должно быть?
0
xtorne21st
интересующийся
305 / 276 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 23:36  [ТС] 6
Цитата Сообщение от Croessmah Посмотреть сообщение
А как, по-вашему, должно быть?
Сначала должно вывести на консоль Hello world, а затем запрос на ввод.
1
Croessmah
++Ͻ
15645 / 8807 / 1689
Регистрация: 27.09.2012
Сообщений: 21,706
Записей в блоге: 2
Завершенные тесты: 2
28.01.2013, 23:45 7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Сначала должно вывести на консоль Hello world, а затем запрос на ввод.
чтобы было понятнее введите первый раз не
Greed you
а
Greed
и посмотрите разницу
0
Avazart
Эксперт С++
7919 / 5740 / 568
Регистрация: 10.12.2010
Сообщений: 26,285
Записей в блоге: 17
29.01.2013, 00:46 8
Ну не знаю.. Builder та же фигня, ща проверю в VC++

Добавлено через 13 минут
В VC++ также работает...
0
xtorne21st
интересующийся
305 / 276 / 93
Регистрация: 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;
}
1
Vourhey
Почетный модератор
6497 / 2272 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
29.01.2013, 01:05 10
Когда ты создаешь объект инпут-итератора, то конструктор ждет поток. Поэтому так и работает. Перенеси создание инпут-итератора после работы с oo и будет работать, как ожидалось.
1
xtorne21st
интересующийся
305 / 276 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:16  [ТС] 11
Цитата Сообщение от Vourhey Посмотреть сообщение
Когда ты создаешь объект инпут-итератора, то конструктор ждет поток. Поэтому так и работает. Перенеси создание инпут-итератора после работы с oo и будет работать, как ожидалось.
Так вот в чём всё дело. В этом конструкторе, а я там уже глупостей наговорил по поводу единой очереди выполнения. Спасибо, теперь всё стало ясно.
0
Vourhey
Почетный модератор
6497 / 2272 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
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 минут

Не по теме:

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

1
xtorne21st
интересующийся
305 / 276 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:52  [ТС] 13
Цитата Сообщение от Vourhey Посмотреть сообщение
И, да, ты можешь сделать как-нибудь так:
Всё верно, как в первом случаи, сначала ждёт ввода с клавиатуры, затемы выводит значения итератора oo, а затем отображает результат итератора ii
0
Vourhey
29.01.2013, 01:57     Ввод/вывод баг или нет?
  #14

Не по теме:

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

0
29.01.2013, 01:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 01:57
Привет! Вот еще темы с ответами:

Запись выражений, ввод–вывод информацииЗапись выражений, ввод–вывод информации
Задача 2.1. Пользуясь только операцией умножения, вычислить (A в 7-ой степени) за четыре операции....

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран?...

Баг или фича
решил проверить на своем VS 2008 присвоение в сравнении написал char buf; char *buf1;...


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

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

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