Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> std::copy and istream_iterator 
:(
    Опции темы
kapusta007
Дата 21.11.2019, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 10.7.2016

Репутация: нет
Всего: нет



делая примеры из книги STL C++17
наткнулся на такой сюрприз уже не в первый раз вот иследуемый   код

Код

#include <iostream>
#include <string>
#include <iterator>
#include <sstream>
#include <deque>

using namespace std;

int main()
{
    
    istream_iterator<int> it_cin{ cin };
    istream_iterator<int> end_cin;

    deque<int> v;

    //copy(it_cin, end_cin, back_inserter(v));
    for (; it_cin != end_cin; ++it_cin)
        v.push_back(*it_cin);

    istringstream sstr{ "123 456 789" };
    auto deque_middle(next(begin(v), static_cast<int>(v.size()) / 2));

    copy(istream_iterator<int>{sstr}, {}, inserter(v, deque_middle));

    initializer_list<int> il2{ -1, -2, -3 };
    copy(begin(il2), end(il2), front_inserter(v));

    copy(begin(v), end(v), ostream_iterator<int>{cout, ", "});
    cout << '\n';
}


при вставке при помощи алгоритма std::copy(it_cin, end_cin, back_inserter(v)); программа зависает.
решил сделать при помощи цикла for 
Код

for (; it_cin != end_cin; ++it_cin)
        v.push_back(*it_cin);

тоже виснет, но выясняются обстоятельства что когда все элементы пройдены и итератор it_cin инкрементируеться последний раз, чтобы проверить истеность и выйти из цикла,  программа засыпает вот прилагаю скрин


user posted image 

PM MAIL   Вверх
xvr
Дата 21.11.2019, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Ctrl-Z нажать не пробовали?

PM MAIL   Вверх
kapusta007
Дата 21.11.2019, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 10.7.2016

Репутация: нет
Всего: нет



Спасибо помогло))) а что это значит? можете рассказать?
PM MAIL   Вверх
kapbepucm
Дата 22.11.2019, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Она не зависает, а ожидает данных из std::cin, при том, что цикл копирования будет повторятся при поступлении новых данных. В вашем коде условие "it_cin != end_cin", если вводить нормальные циферки, всегда выполняется, а "++it_cin" ждёт новых данных. Комбинация клавиш ctrl-Z (не везде будет работать- в моём случае, например, ctrl-D) делает условие "it_cin != end_cin" невыполнимым.

Это сообщение отредактировал(а) kapbepucm - 22.11.2019, 11:03


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
kapusta007
Дата 22.11.2019, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 10.7.2016

Репутация: нет
Всего: нет



kapbepucm, Спасибо за объяснение)) а как тогда прервать считку данных кроме как использование хоткеев? или понять что данные завершились?
PM MAIL   Вверх
xvr
Дата 25.11.2019, 14:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(kapusta007 @  22.11.2019,  21:26 Найти цитируемый пост)
 а как тогда прервать считку данных кроме как использование хоткеев?

Ctrl-Z это не хоткей. Это стандартный способ для консольного потока завершиться. Он на эту комбинацию и выдаёт EOF
Если вы запустите свою программу с перенаправлением ввода (prog.exe <file.txt), то никаких Ctrl-Z будет не нужно - прочтётся файл file.txt и в конце выдаст EOF

Либо читайте из входного потока построчно и сами решаёте, когда завершать программу по анализу того, что прочли.

PM MAIL   Вверх
kapbepucm
Дата 26.11.2019, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: нет
Всего: 12



Цитата(kapusta007 @  22.11.2019,  21:26 Найти цитируемый пост)
а как тогда прервать считку данных кроме как использование хоткеев?
Ну да, вариантов несколько, как упоминал xvr. Я бы в цикле
Код

    for (; it_cin != end_cin; ++it_cin)
        v.push_back(*it_cin);
делал досрочный выход по какому нибудь условию.


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
kapusta007
Дата 1.12.2019, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 10.7.2016

Репутация: нет
Всего: нет



Парни спасибо за объяснение)))!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1261 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.