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

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

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

Заодно, если можно поясните плиз, вот этот объекты cout и cin они как бы одни единственные на всю прораммму или у каждой функции свой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2011, 08:17     Залипающие манипуляторы
Посмотрите здесь:

C++ манипуляторы
манипуляторы C++
C++ Манипуляторы в С++
C++ Залипающие
Можно ли сделать залипающие кнопки в WTL без переписывания класса CButton? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 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 / 50
Регистрация: 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 / 50
Регистрация: 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++
Собственные манипуляторы C++

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

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

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