С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vxg
Модератор
3189 / 1992 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
#1

Сбрасывается форматирование std::stringstream при очистке потока - C++

27.06.2014, 15:01. Просмотров 738. Ответов 8
Метки нет (Все метки)

Имеем объект класса std::stringstream используемый для форматированного вывода. Перед очередным выводом производится очистка потока. После очистки все форматирование сбрасывается. Как бы узнать - нормально ли это? Borland C++ Builder 6 (если это влияет).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    std::stringstream ss;
    ss.width(2);
    ss.setf(std::ios::right, std::ios::adjustfield);
    ss.fill('0');
 
    ss << 1;
    std::string s = ss.str(); //01 - ok
 
    ss.str("");
    ss.clear();
 
    ss << 1;
    s = ss.str(); //1 - за что?! где мои ширина, выравнивание и символ заполнитель???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2014, 15:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сбрасывается форматирование std::stringstream при очистке потока (C++):

std::stringstream precision - C++
Как обрезать количество символов во входной строковой поток? к примеру: float a=4.768123; std::stringstream ss; ss &lt;&lt; a; ...

Очистить поток std::stringstream - C++
Вызываю функцию и в ней в поток инициализирую строку lеftPPF, далее вызываю повторно функцию и иниц-я проводится еще раз, и в потоке...

Как сделать std::stringstream - C++
Как преобразовать из &quot;const char *&quot; в &quot;LPCWSTR&quot; ... std::stringstream Str_Stream; Str_Stream &lt;&lt; App_Tittle.c_str() &lt;&lt; &quot; FPS: &quot;...

как узнать размер std::stringstream - C++
в обьект типа stringstream пишем неизвестное число байт. Как узнать сколько байт записалось в поток?

Проблемы с созданием потока stringstream - C++
Компилятор ругается на строку stringstream str Пишет: main.cpp:18:19: error: aggregate ‘std::ostringstream ss’ has incomplete type...

Извлечение строки из потока stringstream - C++
Как убрать(извлечь) из потока stringstream первые n строк? Пробовал: stringstream sstream; /* ... */ char s; ...

8
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
27.06.2014, 17:34 #2
vxg, Сбрасывает не clear, а str(""). Что вцелом, логично, однако подтверждение стоит поискать в стандарте.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.06.2014, 21:55 #3
Цитата Сообщение от vxg Посмотреть сообщение
Borland C++ Builder 6 (если это влияет).
Можно только посочувствовать.
Цитата Сообщение от vxg Посмотреть сообщение
После очистки все форматирование сбрасывается.
Не все. И не сбрасывается. Надо просто ширину задать по новой, т.к. она влияет только на следующее выводимое значение. О чем написано например тут:
Width of the next formatted element to insert.
1
vxg
Модератор
3189 / 1992 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
30.06.2014, 09:47  [ТС] #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Сбрасывает не clear, а str(""). Что вцелом, логично, однако подтверждение стоит поискать в стандарте
к ужасу выяснено, что сбрасывает просто первый же вывод.
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно только посочувствовать.
ой, ай, вот если бы в других средах этого не было тогда "буэ" было бы уместно. среда озвучена не для "да он на велосипеде, ахаха", а для "да, в той версии компилятора есть отклонения" - чего как мы видим нет
Цитата Сообщение от Tulosba Посмотреть сообщение
О чем написано
в том то и дело что не нашел там такого. точнее это действительно написано в шапке, но, если я верно понимаю работу класса (откашливается и поправляет галстук), то такое поведение - маразм. зачем после каждого вывода сбрасывать ширину? я ведь задал ее не манипулятором. и если она каждый раз сбрасывается как ее задать на веки вечные? что бы она возвращалась при вызове width()?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.06.2014, 11:06 #5
Цитата Сообщение от vxg Посмотреть сообщение
зачем после каждого вывода сбрасывать ширину?
Суть в том, что некоторые стандартные функции гарантированно вызывают width(0), поэтому установку ширины распространили только на ближайший аргумент, чтобы не было недоразумений.
Ответ нашел тут: http://stackoverflow.com/a/1533752/3240681
2
vxg
Модератор
3189 / 1992 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
30.06.2014, 11:10  [ТС] #6
печально
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.06.2014, 11:52 #7
Цитата Сообщение от vxg Посмотреть сообщение
печально
Ну, я думаю, не так страшно (сложно) добавить вызов width(N) перед каждым выводом.
0
vxg
Модератор
3189 / 1992 / 228
Регистрация: 13.01.2012
Сообщений: 7,712
30.06.2014, 12:58  [ТС] #8
просто предполагалось что человек настроит поток как ему надо работая непосредственно с потоком и все эти настройки будут применяться к выводу. а теперь придется все эти настройки выносить в поля обертки
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.06.2014, 14:03 #9
Цитата Сообщение от vxg Посмотреть сообщение
предполагалось что человек настроит поток как ему надо
Я бы тут наверное предложил создать (наследовать от стандартного) свой поток с блекджеком и шлюхами Но совсем недавно выяснил некоторые подробности, поэтому не буду уже такого предлагать со 100% уверенностью.
0
30.06.2014, 14:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2014, 14:03
Привет! Вот еще темы с ответами:

Ошибка при создании потока std::thread - C++
Внутри класса есть функция void move(); Нужно, чтобы она работала в отдельном потоке. Проблема : неправильно указываю параметры....

Не корректно работает вывод из потока stringstream - C++
Здравствуйте форумчане, не корректно работает ввод из потока. Не знаю в чем проблема. stringstream InStream; //создаем поток char...

Ошибка при очистке памяти - C++
Есть часть когда в программе, должна сложить объекты, в которых находятся строки. Возникает ошибка при очистке памяти в ...

Присоединение потока std::thread - C++
Есть некая функция: int arr(){ do_something(); std::thread th1({ func1(); func2(); func3();}); th1.join() do_something2(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.