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

Флаги форматирования и манипуляторы - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 322, средняя оценка - 4.78
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
08.09.2009, 21:36     Флаги форматирования и манипуляторы #1
У многих новичков возникают вопросы, как вывести число в таком-то формате, а можно вывести так или так. Чтоб стало более ясно, вот небольшая
программка с комментариями.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <iomanip>
int main()
{
    setlocale(LC_ALL, "Russian");
    char _char[] = "char\n"; 
    int _int = 20;
    int negative_int = -10;
    double _double = 123.5467;
    float zero_float = 10;
 
//======== работаем с выравниванием ========\\
    
    std::cout<<"Работаем с выравниванием\n";
    //устанавливаем ширину поля вывода
    std::cout.width (20);
    //устанавливаем символ заполнитель(по умолчанию - пробел)
    std::cout.fill ('_');
    //флаг форматирования при котором знак числа выводится по левому краю, 
    //число — по правому. Промежуток заполняется символами заполнителя
    std::cout.setf(std::ios::internal);
    std::cout<<negative_int<<std::endl;
 
    //устанавливаем ширину поля вывода
    std::cout.width(50);
    //устанавливаем символ заполнитель(по умолчанию - пробел)
    std::cout.fill ('/');
    //выравниваем по правому краю поля
    std::cout.setf(std::ios::right);
    std::cout<<_char<<std::endl;
 
    //P.S. флаги  left, right и internal не могут быть установлены одновременно.
 
//======== выводим в разных системах исчисления ========\\
 
    std::cout<<"Выводим в разных системах исчисления\n";
    //восьмеричная система счисления
    std::cout.flags(std::ios::oct);
    std::cout<<_int<<std::endl;
 
    //десятичная система счисления
    std::cout.flags(std::ios::dec);
    std::cout<<_int<<std::endl;
 
    //шестнадцатеричная система счисления
    std::cout.flags(std::ios::hex);
    std::cout<<_int<<std::endl;
 
    //задаем основание системы счисления (8, 16, 10 или 0)
    //по умолчанию 0 - это десятичное, кроме случаев, когда вводятся 8- или
    //16-ричные числа. Здесь к примеру основание 8
    std::cout<<std::setbase(8)<<_int<<std::endl;
 
    //P.S. флаги dec, oct и hex не могут быть установлены одновременно.
 
//======== выводим вещественные чисел ========\\
 
    std::cout<<"\nВыводим вещественные числа\n";
    //при выводе вещественных чисел печатаем десятичную точку и дробную часть
    std::cout.flags(std::ios::showpoint);
    std::cout<<zero_float<<std::endl;
 
    //печатаем вещественные числа в форме мантиссы с порядком
    std::cout.flags(std::ios::scientific);
    std::cout<<_double<<std::endl;
    
    //Печатаем вещественные числа в форме с фиксированной точкой, 
    //точность определяем строкой ниже в setprecision
    std::cout.flags(std::ios::fixed);
    std::cout<<std::setprecision(2)<<_double<<std::endl;
 
    //P.S. флаги scientific и fixed не могут быть установлены одновременно
 
//======== печатаем знаки ========\\
 
    std::cout<<"\nПечатаем знаки\n";
    //печатаем знак при выводе положительных чисел
    std::cout.flags(std::ios::showpos);
    std::cout<<_int<<std::endl;
 
    system("pause");
    return 0;
}
Я выбирал самые основные. Кто может добавить, если я что-то пропустил - добавляйте. Буду только благодарен
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2009, 21:36     Флаги форматирования и манипуляторы
Посмотрите здесь:

Манипуляторы и флаги формата C++
C++ манипуляторы
манипуляторы C++
Манипуляторы C++
Манипуляторы. От С к С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.06.2012, 10:51     Флаги форматирования и манипуляторы #21
M128K145, а вместе с flags(std::ios::hex); можно ещё как нибудь задать верхний регистр для букв A-F?

Добавлено через 6 минут
C:\tsserver\Projects\cpp\codeblocks\SeaJackals\SeaJackals.cpp|262|error: 'setbase' is not a member of 'std'|
.......................
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Петррр
 Аватар для Петррр
5914 / 3351 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
21.06.2012, 10:52     Флаги форматирования и манипуляторы #22
C++
1
2
int num = 0xabcdef;
std::cout << std::hex << std::uppercase << num << std::endl;
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.06.2012, 10:57     Флаги форматирования и манипуляторы #23
Как вывести в двоичном виде?
Петррр
 Аватар для Петррр
5914 / 3351 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
21.06.2012, 11:35     Флаги форматирования и манипуляторы #24
http://www.cplusplus.com/reference/c.../cstdlib/itoa/
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
24.06.2012, 14:51     Флаги форматирования и манипуляторы #25
Если через std::cout печатать char, то напечатается он в виде символа. А как напечатать char в виде числа (ибо char - это целочисленный тип размером в 1 байт)?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 14:54     Флаги форматирования и манипуляторы #26
C++
1
std::cout << (int)ch;
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
24.06.2012, 15:00     Флаги форматирования и манипуляторы #27
grizlik78, данный код сделает преобразование к int'у и печать. А как просто напечатать char без преобразований?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 15:03     Флаги форматирования и манипуляторы #28
Ну да. Хотел дописать, что без преобразования (явного или неявного) никак. Может, конечно, мне тоже просто неизвестно.

P.S. А преобразование это ничего не стоит. Есть ли смысл обходиться без него?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
24.06.2012, 15:07     Флаги форматирования и манипуляторы #29
Чтобы понятно было, что я имею в виду, сравни результат на Си и твой вариант на Си++:

C
#include <stdio.h>
 
int main (void)
{
  char c = -1;
  printf ("%hhx\n", c);
  return 0;
}
C++
#include <iostream>
 
int main (void)
{
  char c = -1;
  std::cout.flags(std::ios::hex);
  std::cout << (int)c;
  return 0;
}
Добавлено через 1 минуту
В первом случае напечатается "ff", что логично, во втором - "ffffffff", что не логично (с точки зрения постановки задачи)
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 15:10     Флаги форматирования и манипуляторы #30
Над хорошим способом надо подумать, а если надо по-быстрому вывести именно байты, то можно так:
C++
1
std::cout << (int)(unsigned char)c;
Выглядит ужасно, согласен.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.06.2012, 15:20     Флаги форматирования и манипуляторы #31
Чего с чаром возиться? Табличное преобразование и ни каких гвоздёв.

Добавлено через 1 минуту
Да и можно же так:
C++
1
2
3
char c;
c=-1;
cout<<(int)(unsigned char)c;
Старшие биты заполнятся нолями и ни каких гвоздёв.

Добавлено через 2 минуты
Цитата Сообщение от Петррр Посмотреть сообщение
http://www.cplusplus.com/reference/c.../cstdlib/itoa/
А без принтфа? А то он для меня до сих пор сложнее иероглифов.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
24.06.2012, 15:27     Флаги форматирования и манипуляторы #32
Цитата Сообщение от taras atavin Посмотреть сообщение
А без принтфа? А то он для меня до сих пор сложнее иероглифов.
Для потоков можно писать свои собственные манипуляторы.

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
В первом случае напечатается "ff", что логично, во втором - "ffffffff", что не логично (с точки зрения постановки задачи)
C++
1
cout << (c&0xff)
можно так попробовать.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
24.06.2012, 15:35     Флаги форматирования и манипуляторы #33
Цитата Сообщение от grizlik78 Посмотреть сообщение
Над хорошим способом надо подумать, а если надо по-быстрому вывести именно байты, то можно так
Да я знаю, как это сделать через онанизм. У меня вопрос: можно ли сделать без онанизма? Ответ уже вроде бы как получен, что нет. Это 100%?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 15:37     Флаги форматирования и манипуляторы #34
Цитата Сообщение от Evg Посмотреть сообщение
Ответ уже вроде бы как получен, что нет. Это 100%?
По-крайней мере манипуляторов таких нет. А способ с маской мне понравился.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.06.2012, 15:46     Флаги форматирования и манипуляторы #35
Цитата Сообщение от kazak Посмотреть сообщение
Для потоков можно писать свои собственные манипуляторы.
Как? Дай, пожалуйста ссылку на туториал.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Да я знаю, как это сделать через онанизм. У меня вопрос: можно ли сделать без онанизма?
Именно через него ты и просишь.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16821 / 5242 / 318
Регистрация: 30.03.2009
Сообщений: 14,118
Записей в блоге: 26
24.06.2012, 15:56     Флаги форматирования и манипуляторы #36
Цитата Сообщение от grizlik78 Посмотреть сообщение
А способ с маской мне понравился.
С маской или с преобразованием типа - оно годится лишь само по себе. А ведь в Си++ есть такое мощное средство как шаблон, в котором такие способы превращают код в бардак (со специализациями) на ровном месте
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
24.06.2012, 16:08     Флаги форматирования и манипуляторы #37
Цитата Сообщение от taras atavin Посмотреть сообщение
Как? Дай, пожалуйста ссылку на туториал.
http://xprogramming.narod.ru/Trash/Chapter9.htm#8
http://www.firststeps.ru/mfc/msdn/r.php?173
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.06.2012, 16:16     Флаги форматирования и манипуляторы #38
Цитата Сообщение от Evg Посмотреть сообщение
превращают код в бардак (со специализациями) на ровном месте
Каким образом шаблон, навёрнутый на сериализацию всегда в байты может добавить бардака?

Добавлено через 2 минуты
Цитата Сообщение от kazak Посмотреть сообщение
http://xprogramming.narod.ru/Trash/Chapter9.htm#8
http://www.firststeps.ru/mfc/msdn/r.php?173
Вижу использование готовых манипуляторов. А где создание?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 16:18     Флаги форматирования и манипуляторы #39
Evg, да, к сожалению C++ неидеален, как и мир. Но это ты и сам знаешь
Придётся или специализации писать, или свой потоковый класс, на использование которого, кстати, можно переключать с использованием своего манипулятора. Кажется
Только в классе том вряд ли без специализаций обойтись. нет в жизни счастья.

Кстати, кто знает, в новый стандарт не включили ли случайно пользовательские манипуляторы с параметрами? В прошлом, вроде, не было стандартного способа определять свой манипулятор с параметрами.

Добавлено через 1 минуту
taras atavin, манипулятор — обычная функция, принимающая ссылку на поток и возвращающая ссылку на поток.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 16:26     Флаги форматирования и манипуляторы
Еще ссылки по теме:

C++ Манипуляторы ввода-вывода. Флаги
C++ Флаги форматирования в cout, выравнивание справа
Флаги форматирования cout C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.06.2012, 16:26     Флаги форматирования и манипуляторы #40
Эйси. А как её писать? Ведь мне же не в манипулятор потом выводить оператором <<, а в сам поток. Как управление передаётся? Или что он делает?
Yandex
Объявления
24.06.2012, 16:26     Флаги форматирования и манипуляторы
Ответ Создать тему

Метки
Манипуляторы, с++, Флаги форматирования
Опции темы

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