Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
thick_int
Заблокирован
#1

Залипающие манипуляторы - C++

17.11.2011, 08:17. Просмотров 857. Ответов 6
Метки нет (Все метки)

У меня следующий вопрос. До каких пор эти манипуляторы (например setfill) залипают?
Имеется в виду следующее. Допустим я в некоторой функции воспользовался одним из таких залипающих манипуляторов. Функция завершилась. А вот теперь продолжится ли залипание или на этом конец.
Грубо говоря, какова область залипания этих манипуляторов?

Заодно, если можно поясните плиз, вот этот объекты cout и cin они как бы одни единственные на всю прораммму или у каждой функции свой?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.11.2011, 10:30     Залипающие манипуляторы #2
Насколько знаю залипающие манипуляторы нужно сбрасывать после использования.

Добавлено через 34 секунды
Вот даже у Дейтелов нашел
Для каждой залипающей установки (такой, как символ заполнения
или точность значений с плавающей точкой) следует
восстанавливать ее предыдущее значение, когда она более не нужна. Если этого не
сделать, последующий вывод программы может оказаться
форматированным неверно.


Добавлено через 2 минуты
И вот
Манипулятор потока setfill является «залипающей» установкой, т.е. как только
символ заполнения специфицирован, он будет относиться ко всем последующим
выводимым полям.
thick_int
Заблокирован
17.11.2011, 11:34  [ТС]     Залипающие манипуляторы #3
Вот я этот же самый кусок читаю, проверяяю и все не совсем так.
То есть все это так, но только в пределах одной функции, на первый взглядтак кажется.
То есть, если я вызываю функцию и в этой вызванной функции использую залипающий манипулятор, то вот как кажется, область его действия - это вызванная функция (если далее не трогать его), а вернувшись из нее все становится,какбыло в вызвавшей функции. То есть происходит сброс этого манипулятора.
Вот меня и интересует правильно ли я понимаю поведение этой штуки.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.11.2011, 14:37     Залипающие манипуляторы #4
Только что проверил, даже если это сделать в функции, то после выхода из нее все равно остается установка.
Вот код которым тестировал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
 
void test( int );
int main()
{
    int x = 5;
 
    std::cout << std::setw( 10 ) << x << std::endl;
 
    test( x );
 
    std::cout << std::setw( 10 ) << x << std::endl;
 
    std::cout << '\a' << std::endl;
    system( "pause" );
    return 0;
}
void test( int x ) {
    std::cout << std::setfill( '0' ) << std::setw( 10 ) << x << std::endl;
}
И вот что вышло.
Миниатюры
Залипающие манипуляторы  
thick_int
Заблокирован
17.11.2011, 14:54  [ТС]     Залипающие манипуляторы #5
А у меня все как раз наоборот.
Вот мой код (кстати из той же главы Дейтла, где рассказывается про классы и в частности про класс Time).
Ну правда у меня выход из функций класса

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int _tmain(int argc, _TCHAR* argv[])
{
    Time t;
    cout << "The initial universal time is ";
    t.printUniversal();
    cout << "\nThe initial standard time is ";
    t.printStandard();
 
    t.setTime(13, 27, 6);
    cout << "\nUniversal time after setTime is ";
    t.printUniversal();
    cout << "\nStandard time after setTime is ";
    t.printStandard();
 
    t.setTime(99, 99, 99);
    cout << "\nUniversal time after invalid setTime is ";
    t.printUniversal();
    cout << "\nStandard time after invalid setTime is ";
    t.printStandard();
 
    int a = 2;
    cout << a;
    cout << endl;
    return 0;
}
Ну а сам этот класс Вам знаком, именно в функциях-членах выставляется этот манипулятор.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
17.11.2011, 14:59     Залипающие манипуляторы #6
Неправильная проверка. Нужно написать
C++
1
cout << setw(2) << a;
Вместо
C++
1
cout << a;
Тогда будет видно. Потому что setfill заполняет не занятые поля выводимых данных но зарезервированные ими командой setw. По умолчанию эти поля заполняются пробелами. Так что после использования нужно сбрасывать командой
C++
1
std::cout << std::setfill( ' ' );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2011, 15:14     Залипающие манипуляторы
Еще ссылки по теме:

Манипуляторы. От С к С++ C++
Собственные манипуляторы C++
Манипуляторы setprecision и fixed C++
Манипуляторы, определяемые пользователем C++
Манипуляторы ввода/вывода C++

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

Или воспользуйтесь поиском по форуму:
thick_int
Заблокирован
17.11.2011, 15:14  [ТС]     Залипающие манипуляторы #7
Да, спасибо теперь точно, как у Вас.
А заодно стало понятно и со вторым вопросом.
Yandex
Объявления
17.11.2011, 15:14     Залипающие манипуляторы
Ответ Создать тему
Опции темы

Текущее время: 03:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru