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

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

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

28.01.2013, 21:24. Просмотров 509. Ответов 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 на который указывает итератор?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2013, 21:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввод/вывод баг или нет? (C++):

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

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

Поменять консольный ввод-вывод на файловый ввод-вывод - C++
вот у меня калькулятор как мне сделать что б числа вводились из файла и результат записывался в новый файл ? // ОБРАТНАЯ...

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

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

Баг или фича - C++
решил проверить на своем VS 2008 присвоение в сравнении написал char buf; char *buf1; if(buf1=buf) все прошло никакого...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,225
Записей в блоге: 3
Завершенные тесты: 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
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 21:40  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
и посмотрите так это или нет.
Да действительно, сначала отображается слово "My", а потом запрос на ввод строки пользователю. Но отсюда вытекает следующий вопрос: "Почему тогда в начале не отображается значение итератора оо?"
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
28.01.2013, 21:51 #4
Мда интересный момент...
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,225
Записей в блоге: 3
Завершенные тесты: 1
28.01.2013, 22:52 #5
Цитата Сообщение от xtorne21st Посмотреть сообщение
Но отсюда вытекает следующий вопрос: "Почему тогда в начале не отображается значение итератора оо?"
А как, по-вашему, должно быть?
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
28.01.2013, 23:36  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А как, по-вашему, должно быть?
Сначала должно вывести на консоль Hello world, а затем запрос на ввод.
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,225
Записей в блоге: 3
Завершенные тесты: 1
28.01.2013, 23:45 #7
Цитата Сообщение от xtorne21st Посмотреть сообщение
Сначала должно вывести на консоль Hello world, а затем запрос на ввод.
чтобы было понятнее введите первый раз не
Greed you
а
Greed
и посмотрите разницу
Avazart
Эксперт С++
7145 / 5322 / 275
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
29.01.2013, 00:46 #8
Ну не знаю.. Builder та же фигня, ща проверю в VC++

Добавлено через 13 минут
В VC++ также работает...
xtorne21st
интересующийся
304 / 275 / 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
Почетный модератор
6478 / 2253 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
29.01.2013, 01:05 #10
Когда ты создаешь объект инпут-итератора, то конструктор ждет поток. Поэтому так и работает. Перенеси создание инпут-итератора после работы с oo и будет работать, как ожидалось.
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:16  [ТС] #11
Цитата Сообщение от Vourhey Посмотреть сообщение
Когда ты создаешь объект инпут-итератора, то конструктор ждет поток. Поэтому так и работает. Перенеси создание инпут-итератора после работы с oo и будет работать, как ожидалось.
Так вот в чём всё дело. В этом конструкторе, а я там уже глупостей наговорил по поводу единой очереди выполнения. Спасибо, теперь всё стало ясно.
Vourhey
Почетный модератор
6478 / 2253 / 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
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 01:52  [ТС] #13
Цитата Сообщение от Vourhey Посмотреть сообщение
И, да, ты можешь сделать как-нибудь так:
Всё верно, как в первом случаи, сначала ждёт ввода с клавиатуры, затемы выводит значения итератора oo, а затем отображает результат итератора ii
Vourhey
29.01.2013, 01:57     Ввод/вывод баг или нет?
  #14

Не по теме:

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

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

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

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

Ошибка или баг в Dev C++? - C++
помогите разобраться: вот простой код #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; class card { public: ...

Баг компилятора или я дурак? - C++
До:http://www.cyberforum.ru/attachment.php?attachmentid=840160&amp;stc=1&amp;d=1496427343 ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.01.2013, 01:57
Ответ Создать тему
Опции темы

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