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

Не получается после первой итерации считать во вложенном (ss>>ch) - C++

Восстановить пароль Регистрация
 
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
24.04.2014, 02:55     Не получается после первой итерации считать во вложенном (ss>>ch) #1
Код вычисляет (вернее должен ) сумму чисел в числе,затем считывает обратно в поток stringstream и делает то же снова пока сумма не будет меньше 10. Проблема в том что после первой итерации я не могу считать во вложенном
(ss>>ch). По идее я убрал бит достижения конца потока. Объясните на пальцах пожалуйста, в чем моя ошибка..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int sum = 0;
    stringstream ss("13245");
    char ch;
    while (1)
    {
        while (ss >> ch)
        {
            sum += ch - '0';
        }
        ss.clear();
        ss << sum;
        if (sum<10 ) break;
                 sum=0;
 
        
    }
    cout << sum;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 02:55     Не получается после первой итерации считать во вложенном (ss>>ch)
Посмотрите здесь:

C++ Как очистить консоль после итерации цикла?
C++ Не получается считать информацию из файла в 2-х мерный массив (С++)
C++ Строки: уничтожить в строке запятые перед первой точкой, заменить знаком + все цифры 3я после первой точки
C++ Пропускает операторы считывания информации после первой итерации
getline() (не получается считать информацию с файла) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
24.04.2014, 09:16     Не получается после первой итерации считать во вложенном (ss>>ch) #2
У меня заработало вот в таком виде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <strstream>
using namespace std;
int main()
{
    int sum;
    char buffer[]="13245";
    char ch;
    while (1)
    {
        sum=0;
        istrstream ss(buffer,5);
        while (ss >> ch && ch )
            sum += ch - '0';
        ostrstream sso(buffer,5);
        sso << sum<<'\0';
        if (sum<10) break;
    }
    cout << sum<<endl;
    system("pause");
    return 0;
}
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
24.04.2014, 09:41     Не получается после первой итерации считать во вложенном (ss>>ch) #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Перед записью в поток его следует очистить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
    int sum = 0;
    stringstream ss("13245");
    char ch;
    while (1){
        sum=0;
        while (ss >> ch) {
            sum += ch - '0';
        }
        ss.clear();
        ss.str("");
        //cout << sum << endl; //Проверка
        ss << sum;
        //cout << ss.str() << endl; //Проверка
        if (sum<10 ) break;
    }
    cout << sum;
    return 0;
}
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
24.04.2014, 19:58  [ТС]     Не получается после первой итерации считать во вложенном (ss>>ch) #4
Ilot, точно,я полагал что оператор ">>" извлекает из потока (то есть,что при достижение EOF поток становится пустым )

zss, Не пойму как работает программа... Прокомментируйте пожалуйста отмеченные строки кода..И мы тут вроде бы инициализируем поток буфером (в цикле ),так как туда попадает сумма ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <strstream>
using namespace std;
int main()
{
* * int sum;
* * char buffer[]="13245";
* * char ch;
* * while (1)
* * {
* * * * sum=0;
* * * * istrstream ss(buffer,5);
* * * * while (ss >> ch && ch )     //Вот эту 
* * * * * * sum += ch - '0';
* * * * ostrstream sso(buffer,5);
* * * * sso << sum<<'\0';
* * * * if (sum<10) break;
* * }
* * cout << sum<<endl;
* * system("pause");
* * return 0;
}
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
24.04.2014, 20:32     Не получается после первой итерации считать во вложенном (ss>>ch) #5
Цитата Сообщение от TheChosenOne Посмотреть сообщение
while (ss >> ch && ch )
Это почти Ваша строка, в которой проверяется конец ввода,
я добавил только проверку на конец строки (ch!=0)
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
24.04.2014, 21:08  [ТС]     Не получается после первой итерации считать во вложенном (ss>>ch) #6
zss, тогда откуда в потоке ss появляется sum ? Вы ведь помещаете его в поток sso?
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
24.04.2014, 21:12     Не получается после первой итерации считать во вложенном (ss>>ch) #7
Цитата Сообщение от TheChosenOne Посмотреть сообщение
Вы ведь помещаете его в поток sso?
А буфер обоих потоков один и тот же.
Программу протестировал - работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2014, 02:42     Не получается после первой итерации считать во вложенном (ss>>ch)
Еще ссылки по теме:

Не получается считать строку с gets C++
Пропуск вызова cin.getline в первой итерации цикла C++
C++ Не получается считать из файла информацию

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

Или воспользуйтесь поиском по форуму:
TheChosenOne
13 / 13 / 1
Регистрация: 13.09.2013
Сообщений: 113
25.04.2014, 02:42  [ТС]     Не получается после первой итерации считать во вложенном (ss>>ch) #8
zss, то что программа работает,это да ))
Спасибо,я понял )

Добавлено через 41 минуту
А функция форматированной вставки " >> " извлекает информацию из потока, удаляя считанные данные из него?

Добавлено через 46 минут
И если нет,то как добраться до данных в потоке снова ?

Добавлено через 2 часа 11 минут
Все,разобрался
Yandex
Объявления
25.04.2014, 02:42     Не получается после первой итерации считать во вложенном (ss>>ch)
Ответ Создать тему
Опции темы

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