Использование stringstream внутри цикла для извлечения числа из нескольких строк - PullRequest
0 голосов
/ 10 июня 2018

В настоящее время я практикуюсь со строковыми потоками, чтобы извлечь значения из строки.В этом простом коде пользователь вводит имя и число (разделенные пробелом), эта строка сохраняется во «вводе».Затем он передается в «поток» и разделяет имя и номер, которые хранятся в «имя» и «номер».Затем номер выводится с помощью std :: cout.Этот процесс выполняется несколько раз с разными именами и номерами.

#include <sstream>
#include <iostream>

int main() {
    std::string input;
    std::stringstream stream;
    std::string name;
    double amount;

    for (;;) {
        std::getline(std::cin, input);      // enter a name, a whitespace and a number
        stream.str(input);
        stream >> name >> amount;           // problem here
        std::cout << amount << std::endl;

    }
    return 0;
}

Проблема: в «сумме» сохраняется только номер первого введенного ввода.Номера следующих входов не будут храниться в «сумме» (сумма всегда имеет одинаковое число внутри).Может быть, есть кое-что, чего я не знаю о струнных потоках ...

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Проблема: в "сумме" сохраняется только номер первого введенного ввода.Номера следующих входов не будут храниться в «сумме» (сумма всегда имеет одинаковое число внутри).Может быть, есть кое-что, чего я не знаю о струнных потоках ...

Да.Вы забыли сбросить std::stringstream после того, как вы использовали один раз.

Чтобы сделать это, вам нужно установить обе основные последовательности (содержимоеstringstream) в пустую строку, используя std::stringstream::str, а также fail (если есть) и eof флаги с clear.

Это означает, что конец вашей for петли вам нужен: SEE LIVE

int main()
{
   ....
   ....
   for (;;)
   {
      ...
      ...
      stream.str( std::string() );   // or stream.str(""); 
      stream.clear();
   }
   return 0;
}
0 голосов
/ 10 июня 2018

Проблема в том, что позиция чтения не определена при вызове str(string).В результате stream переходит в состояние ошибки, вот доказательство .

Лучший способ исправить это - переместить область действия stream внутри цикла:

#include <sstream>
#include <iostream>

int main() {
    std::string input;
    std::string name;
    double amount;

    while (std::getline(std::cin, input)) {
        std::stringstream stream(input);
        stream >> name >> amount;
        std::cout << amount << " " << name << std::endl;

    }
    return 0;
}

Вот доказательство того, что оно работает .На самом деле лучше всего переместить больше переменных внутри цикла .

0 голосов
/ 10 июня 2018

Попробуйте вместо этого использовать Input StringStream std::istringstream, который предназначен для работы в качестве входного потока (например, std::cin), в отличие от std::stringstream:

#include <sstream>
#include <iostream>

int main() {
    std::string input;
    std::istringstream stream; // Note the extra i
    std::string name;
    double amount;

    for (;;) {
        std::getline(std::cin, input);
        stream.str(input);
        stream >> name >> amount;
        std::cout << amount << std::endl;

    }
    return 0;
}

Вход: Hello 3.14

Выход: 3.14

Вход: Мир 2,71

Выход: 2,71

...