Имеется следующая программа:
#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. Где в программе
ошибка и как правильно проводить реинициализацию потока?
Работа с istringstream (Проблема с реинициализацией экземпляра потока)
Модератор: Модераторы разделов
-
- Сообщения: 125
- Статус: Тролль-Лѣсовичокъ
- ОС: Свободная aka ArchLinux
Re: Работа с istringstream
Проблема в том, что первый раз делая
вы доходите до конца потока, и больше из него читать уже нельзя. Если бы, например, инициализация проходила так:
то программа работала бы корректно...
Но что конкретно нужно сделать, я не знаю пока...
Кстати, рекомендую вам оформлять код соотвествующим образом, использовать специально предназаначенные для этого дела тэги.
Код: Выделить всё
stream >> d;
вы доходите до конца потока, и больше из него читать уже нельзя. Если бы, например, инициализация проходила так:
Код: Выделить всё
string s1("0.87 linux muzdie");
то программа работала бы корректно...
Но что конкретно нужно сделать, я не знаю пока...
Кстати, рекомендую вам оформлять код соотвествующим образом, использовать специально предназаначенные для этого дела тэги.
-
- Сообщения: 53
Re: Работа с istringstream
Attila писал(а): ↑19.03.2008 17:58Проблема в том, что первый раз делая
Код: Выделить всё
stream >> d;
вы доходите до конца потока, и больше из него читать уже нельзя. Если бы, например, инициализация проходила так:
Код: Выделить всё
string s1("0.87 linux muzdie");
то программа работала бы корректно...
Но что конкретно нужно сделать, я не знаю пока...
Пробовал
Код: Выделить всё
stream.seekg( 0 , ios::beg )
после
Код: Выделить всё
stream.str( s2 );
, не помогает.
Да, так действительно лучше.
Но проблема остаётся.
-
- Сообщения: 125
- Статус: Тролль-Лѣсовичокъ
- ОС: Свободная aka ArchLinux
Re: Работа с istringstream
Дело в том, что перед
нужно вызывать clear:
clear сбрасывает флаг, указывающий на конец потока. Поэтому можно будет продолжать чтение из него.
Код: Выделить всё
stream.str( s2 );
нужно вызывать clear:
Код: Выделить всё
stream.clear();
clear сбрасывает флаг, указывающий на конец потока. Поэтому можно будет продолжать чтение из него.
-
- Сообщения: 53
Re: Работа с istringstream
Помогло. Разобрался с флагами состояния потока. Спасибо за помощь.