Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Прочитать последовательность слов из потока ввода. - C++

10.05.2009, 23:58. Просмотров 1360. Ответов 7
Метки нет (Все метки)

Прочитать последовательность слов из потока ввода.Пусть слово Quit будет означать конец ввода.Я сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    istream_iterator<string>eos;  // Это лишняя строка?
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.resize(strings_vector.size()+1);
        else break;
        ++my_iterator;
    }
}
Не додумался,как сделать ввод одной строкой,и если Quit присутствует в ней в каком-либо месте,то чтение происходит только до этого места.Можно так сделать?В смысле чтобы сама последовательность символов Quit указывала на конец ввода?Как определить свой страж ввода,отличный от
C++
1
 istream_iterator<string>eos;
?
*Важно* Нужна ли строка
C++
1
 istream_iterator<string>eos;
в этом коде вообще?
P.S.Странно,но по-моему этот код читает в одну строку?...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2009, 23:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прочитать последовательность слов из потока ввода. (C++):

Как прочитать данные из потока вывода другого процесса - C++
Как получить то, что выводит командная строка (прочитать выводной поток другого процесса)

Задана последовательность слов. Определить частоту вхождения каждого слова в последовательность. - C++
Доделать программу, чтобы работала как надо Задана последовательность слов. Определить частоту вхождения каждого слова в...

Считывание слов из потока cin и вывод их в поток cout, с заменой нежелательных слов словом "Bleep" - C++
Напишите программу, заглушающую нежелательные слова; иначе говоря, считайте слова из потока cin и выведите их в поток cout, заменив...

Дана последовательность слов. Найти кол-во слов начинающихся с d и кончающихся буквой w - C++
Кто может, помогите, пожалуйста. Использование указателей при работе со строками С++ Дана непустая последовательность слов из латинских...

Нужно прочитать со входного потока число и строку, как проигнорировать лишние символы? - C++
Всем привет! Со входного потока нужно прочитать число, а затем в новой строке string... Гугл мне сказал, что после того, как мы ввели...

Проверка потока ввода - C++
Всем привет , возникла проблема , которая вызывает затруднения. #include &lt;iostream&gt; using namespace std; int...

7
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
12.05.2009, 14:53 #2
Цитата Сообщение от #pragma Посмотреть сообщение
Можно так сделать?В смысле чтобы сама последовательность символов Quit указывала на конец ввода?
Нет.
Цитата Сообщение от #pragma Посмотреть сообщение
*Важно* Нужна ли строка
В твоем коде не нужна.

И не делай каждый раз resize контейнеру. Просто добавляй в конец контейнера строку(push_back).
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
13.05.2009, 23:30  [ТС] #3
Необходимо удалить повторяющиеся элементы и вывести получившуюся последовательность в порядке ввода.Не нашёл подходящего алгоритма в библиотеке.Попробовал сделать через итераторы,но что-то не идёт,получается обращение к несуществующему элементу и Segmentation fault.Как правильно сделать?Не соображаю уже
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.push_back(*my_iterator);
        else
        {
            strings_vector[i].erase();
            break;
        }
        ++my_iterator;
    }
    vector<string>::iterator a=strings_vector.begin();
    vector<string>::iterator b=strings_vector.begin()+1;
    for (unsigned int i=0;i<strings_vector.size();++i)
       {
         for (unsigned int j=i+1;j<strings_vector.size()+1;++j)
           {
             if (*a==*b) strings_vector.erase(b);
             ++b;
           }
         ++a;
       }
 //   sort(strings_vector.begin(),strings_vector.end());// sort не подходит!
 //   vector<string>::iterator p=unique(strings_vector.begin(),strings_vector.end());
 //   strings_vector.erase(--p,strings_vector.end());
    cout<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
 
}
0
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
14.05.2009, 09:58 #4
Работай либо через итераторы ,либо через индексы...не надо все смешивать.
Замени for на while.
Да и после каждого удаления из контейнера,все итераторы связанные с ним надо инициализировать заново, иначе UB.
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
14.05.2009, 22:59  [ТС] #5
А элементы вектора как вообще сравнивать?
C++
1
strings_vector[i]==strings_vector[j]
Что-то не работает,может,строки не сравниваются и всё удаляется?Я уже итераторы убрал,это должно работать,но нет
C++
1
2
3
4
5
6
7
    for (unsigned int i=0;i<strings_vector.size();++i)
       {
         for (unsigned int j=i+1;j<strings_vector.size()+1;++j)
           {
             if (strings_vector[i]==strings_vector[j]) strings_vector[j].erase();
           }
       }
Само по себе использование цикла for не является ошибкой,по крайней мере грубой.В чём ошибка?А функция erase заботится о перемещении(уплотнении) последовательности в памяти после удаления элемента?

Добавлено через 1 час 43 минуты 56 секунд
Ура! Наконец-то дошло,где была ошибка!В цикле я ограничивал индексы элементов i и j размерностью вектора,а она начинается с 1,а не с нуля.Решено!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void stream_read()
{
    istream_iterator<string>my_iterator(cin);
    vector<string>strings_vector(first_vector_size); // const int first_vector_size=1;
    for (unsigned int i=0;i<strings_vector.size();++i)
    {
        strings_vector[i]=*my_iterator;
        if (strings_vector[i]!="Quit") strings_vector.push_back(*my_iterator);
        else
        {
            strings_vector.pop_back();
            break;
        }
        ++my_iterator;
    }
   /********************* TEST BEGIN ***********************/
    cout<<"Before modification:"<<endl;
    cout<<endl<<"Vector size: "<<strings_vector.size()<<endl
              <<"Members: "<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
   /********************* TEST END *************************/
    for (unsigned int i=0;i<strings_vector.size()-1;++i)
       {
         for (unsigned int j=strings_vector.size()-1;j>i;--j)
             {
                if (strings_vector.at(i)==strings_vector.at(j))
                   strings_vector.at(j).erase();
             }
       }
   /********************* TEST BEGIN ***********************/
    cout<<"After modification:"<<endl;
    cout<<endl<<"Vector size: "<<strings_vector.size()<<endl
              <<"Members: "<<endl;
    for (unsigned int i=0;i<strings_vector.size();++i)
        cout<<strings_vector[i]<<endl;
   /********************* TEST END *************************/
}
А почему while предпочтительнее?И ещё меня смущает,что размерность вектора не меняется после удаления элементов,образуются "дыры"!
0
imeriks
0 / 0 / 0
Регистрация: 18.03.2011
Сообщений: 3
28.03.2013, 21:06 #6
Скажите, пожалуйста, а вы какие include использовали в начале своей программы?
А то у меня проблема с vector<string> ...(size). Пишет undeclared identifier
0
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
30.03.2013, 23:27  [ТС] #7
Ну Вы даёте, теме 4 года ..
Очевидно, нужно написать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
   using std::vector;
 
#include <string>
   using std::string;
 
#include <iterator>
   using std::iterator;
 
#include <iostream>
   using std::cout;
   using std::cin;
   using std::endl;
Вроде всё
0
Dragsaw
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 6
30.03.2013, 23:58 #8
Цитата Сообщение от #pragma Посмотреть сообщение
как сделать ввод одной строкой,и если Quit присутствует в ней в каком-либо месте,то чтение происходит только до этого места.
пробывали использовать функцию get или getline?
0
30.03.2013, 23:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 23:58
Привет! Вот еще темы с ответами:

Считывание с потока ввода - C++
На стандартном потоке ввода задаётся последовательность целых чисел. Каждое число последовательности не меньше -20000000 и не больше...

Ошибка потока ввода - C++
Здравствуйте. Подскажите, почему в этой простой программе, ошибка с оператором потокового ввода &quot;&lt;&lt;&quot;? Пишет, &quot;Отсутствует оператор &lt;&lt;&quot; ...

Очистка потока ввода - C++
ПОМОГИТЕ НАЙТИ ОШИБКУ Ребят написал малюсенький фрагмент кода, но уже есть ошибка. после того как вводим сh, почему то нельзя ввести...

Перегрузка потока ввода - C++
Помогите мне пожалуйста. Пыта #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class rectangle { int *a; ...


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

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

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