Другие языки программирования и технологии

C++. Вопрос для разбирающихся.

Есть класс в котором описан метод. Выглядит метод следующим образом :
void ldtold()
{
dlrs="";
string ustring;
ost << setiosflags(ios::fixed) << setprecision(2) << dollars << '\0';
ustring=ost.str();
dlrs=ustring;
}
Я не давно столкнулся с классом ostrstream. В качестве объекта ostrstream тут выступает ost. Поле класса dollars имеет тип long double.
Допустим поле dollars==5000000;
Проблема заключается в следующем : Когда я вызываю метод ldtold() первый раз(в функции main), то переменной ustring присваивается значение "5000000", т.е метод str() объекта ost преобразовал число long double к корректной. В принципе то что я и хотел.
Но когда я вызываю метод ldtold() еще раз, (допустим при втором вызове поле dollars==7000000), то переменная ustring не меняет свое значение, т.е как было там "5000000", так и осталось.. Почему так? Как можно решить проблему или что нужно еще вызвать для объекта ost?
Егор Пирогов
Егор Пирогов
4 073
Может сначала "почистить" строковый поток:

...
ost.str(string());
ost << setiosflags(ios::fixed) << setprecision(2) << dollars << '\0';
...

По идее второй вызов метода в твоем варианте должен дать строку:
"5000000.00\07000000.00\0"
При условии, что в поле dollars действительно новое значение.

можно вообще объявить строковый поток, как локальную переменной в данном методе, тогда он при каждом новом вызове он будет создан заново и будет пуст.
Виктор Лагошенко
Виктор Лагошенко
84 755
Лучший ответ
Егор Пирогов Спасибо большое, я почему то сделал объект ost глобальным (в других прогах наверное понадобилось) =\ сделал локальным и чистить не приходиться ничего =) !
Сразу оговорюсь, что в плюсах не особо силён и понятия не имею что есть ostrstream. Но уверен, что копать надо именно в этом направлении. Судя по симптомам, лично у меня вариантов 2:
а) ost после первой инициализации более ничего не принимает, а-ля String в Java, но тогда бы вылезала либо runtime error при повторном вызове, либо какой-нибудь эксэпшн либо ещё что-нибудь в этом роде.
б) ostrstream реализован так, что хранит переданные ему значения в каких-то отдельных структурах данных, например в связанном списке, а метод str() возвращает значение 1-го элемена, но не достаёт его из потока/не перемещает указатель чтения/х. з. чего там ещё.
Для подтверждения своих предположений я бы в первую очередь попробовал на каждой итерации цикла (ну или перед каждым вызовом ldtold прибивать ost и создавать заново. Если прокатит, значит на 100% проблема в нём и надо разбиратся в его работе.
Егор Пирогов Да я так и сделал, я объект ost сделал локальным и помогло =)
блин хочу глянуть на умника который ответит на эту хрень))))))) 0!!!!(не вобиду написавшему)
Егор Пирогов Поверьте, есть такие люди для которых это цветочки :))