C++ аналог sscanf

Модератор: Модераторы разделов

ak81
Сообщения: 25

C++ аналог sscanf

Сообщение ak81 »

Требуется считать из строки некоторое количество чисел. Длина строки заранее неизвестна, поэтому хотелось бы пользоваться C++'ными методами, а не привычным sscanf(). Я так понимаю, что надо делать так:

Код: Выделить всё

#include <iostream>
#include <sstream>

using namespace std;

int main(){
  int digit;
  stringstream strm;

  strm.str("1");
  cout << "string: '" << strm.str() << "'\n";
  strm >> digit;
  cout << "digit: " << digit << endl;

  strm.str("2");
  cout << "string: '" << strm.str() << "'\n";
  strm >> digit;
  cout << "digit: " << digit << endl;

  return 0;
}


Но это почему-то не работает. Результат получается такой:

Код: Выделить всё

string: '1'
digit: 1
string: '2'
digit: 1


Где могут быть грабли?
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: C++ аналог sscanf

Сообщение oav »

может проще как-нить?

int digit = strtol( str.c_str() );

:wacko:
Спасибо сказали:
ak81
Сообщения: 25

Re: C++ аналог sscanf

Сообщение ak81 »

Проблема в том, что в строке может быть, например, два числа.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: C++ аналог sscanf

Сообщение oav »

ak81 писал(а):
13.07.2006 18:37
Проблема в том, что в строке может быть, например, два числа.

ыыы, а вы всегда решаете сразу две задачи?

получите две строки и вызовите для них strtol?
Спасибо сказали:
ak81
Сообщения: 25

Re: C++ аналог sscanf

Сообщение ak81 »

Как я получу 2 строки? Есть одна строка, например, "123 345".

Вообще, больше инрересует не обходной путь, а почему приведённый код не работает. Опытным путём установлено, что если в исходные строки в конец добавить по пробелу, то всё работает :blink: .
Спасибо сказали:
Аватара пользователя
mitya
Сообщения: 54

Re: C++ аналог sscanf

Сообщение mitya »

Спасибо сказали:
ak81
Сообщения: 25

Re: C++ аналог sscanf

Сообщение ak81 »

mitya писал(а):
14.07.2006 00:29
Пример

Спасибо за ссылку. У меня то же самое, только stringstream инициализируется по-другому. Чуть модифицировал код (повторил основную часть 2 раз), вылезла та же самая проблема:

Код: Выделить всё

#include <iostream>
#include <sstream>
using namespace std;

int main () {

  int val;
  string mystr;
  stringstream ss (stringstream::in | stringstream::out);

  ss << "120 42 377 6 5 2000";

  for (int n=0; n<6; n++)
  {
    ss >> val;
    cout << val*2 << endl;
  }

  ss << "120 42 377 6 5 2000";

  for (int n=0; n<6; n++)
  {
    ss >> val;
    cout << val*2 << endl;
  }

  return 0;

Код: Выделить всё

> ./a.out
240
84
754
12
10
4000
4000
4000
4000
4000
4000
4000

Неужели stingstream - одноразовый объект и в цикле его каждый раз надо создавать/удалять заново?
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: C++ аналог sscanf

Сообщение oav »

ak81 писал(а):
13.07.2006 19:12
Как я получу 2 строки? Есть одна строка, например, "123 345".

Вообще, больше инрересует не обходной путь, а почему приведённый код не работает. Опытным путём установлено, что если в исходные строки в конец добавить по пробелу, то всё работает :blink: .

Как же тебе объяснить что я тебя подталкиваю к _правельному_ варианту, а стримы это самое неудачная и бесполезная часть стандартной библиотеки C++. Когда ты начнешь решать более сложные задачи ты в этом уже убедишься на _своих_ ошибках. Вот народ... :ph34r:
Спасибо сказали:
ak81
Сообщения: 25

Re: C++ аналог sscanf

Сообщение ak81 »

_Правильный_ вариант был написан и работал уже через пару минут после обнаружения этой проблемы. А вот что именно не правильно в приведённом коде для меня так и остаётся тайной.
Спасибо сказали:
ak81
Сообщения: 25

Re: C++ аналог sscanf

Сообщение ak81 »

Всё, разобрался. Оказывается, после первого чтения из strm у него устанавливается флаг eof, который потом не сбрасывается присвоением strm нового значения. Так что перед последующим использованием надо вызывать strm.clear()...
Спасибо сказали: