Работа с istringstream (Проблема с реинициализацией экземпляра потока)

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

_petya_
Сообщения: 53

Работа с istringstream

Сообщение _petya_ »

Имеется следующая программа:

#include <sstream>
#include <string>
#include <iostream>

using namespace std;

int main()
{
double d;

string s1("0.87");
string s2("0.12");

istringstream stream;

stream.str( s1 );

cout << "stream.str() " << stream.str() << endl;

stream >> d;
cout << "d: " << d << endl;

// Инициализация потока stream строкой s2
stream.str( s2 );

cout << "stream.str() " << stream.str() << endl;

stream >> d;
// В следующей строке на экран выведится 0.87
cout << "d: " << d << endl;

// В следующей строке на экран выведится -1
cout << "stream.tellg(): " << stream.tellg() << endl;
}

В программе после реинициализации потока stream строкой s2 в переменную d заносится
значение 0.87 (соответствующее строке s1), а функция tellg возвращает -1. Где в программе
ошибка и как правильно проводить реинициализацию потока?
Спасибо сказали:
Аватара пользователя
Attila
Сообщения: 125
Статус: Тролль-Лѣсовичокъ
ОС: Свободная aka ArchLinux

Re: Работа с istringstream

Сообщение Attila »

Проблема в том, что первый раз делая

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

stream >> d;

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

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

string s1("0.87 linux muzdie");

то программа работала бы корректно...
Но что конкретно нужно сделать, я не знаю пока...

Кстати, рекомендую вам оформлять код соотвествующим образом, использовать специально предназаначенные для этого дела тэги.
Спасибо сказали:
_petya_
Сообщения: 53

Re: Работа с istringstream

Сообщение _petya_ »

Attila писал(а):
19.03.2008 17:58
Проблема в том, что первый раз делая

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

stream >> d;

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

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

string s1("0.87 linux muzdie");

то программа работала бы корректно...
Но что конкретно нужно сделать, я не знаю пока...

Пробовал

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

stream.seekg( 0 , ios::beg )

после

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

stream.str( s2 );

, не помогает.
Attila писал(а):
19.03.2008 17:58
Кстати, рекомендую вам оформлять код соотвествующим образом, использовать специально предназаначенные для этого дела тэги.

Да, так действительно лучше.

Но проблема остаётся.
Спасибо сказали:
Аватара пользователя
Attila
Сообщения: 125
Статус: Тролль-Лѣсовичокъ
ОС: Свободная aka ArchLinux

Re: Работа с istringstream

Сообщение Attila »

Дело в том, что перед

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

stream.str( s2 );

нужно вызывать clear:

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

stream.clear();

clear сбрасывает флаг, указывающий на конец потока. Поэтому можно будет продолжать чтение из него.
Спасибо сказали:
_petya_
Сообщения: 53

Re: Работа с istringstream

Сообщение _petya_ »

Помогло. Разобрался с флагами состояния потока. Спасибо за помощь.
Спасибо сказали: