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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 322, средняя оценка - 4.78
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
#1

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

08.09.2009, 21:36. Просмотров 41919. Ответов 45

У многих новичков возникают вопросы, как вывести число в таком-то формате, а можно вывести так или так. Чтоб стало более ясно, вот небольшая
программка с комментариями.
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;
}
Я выбирал самые основные. Кто может добавить, если я что-то пропустил - добавляйте. Буду только благодарен
19
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2009, 21:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Флаги форматирования и манипуляторы (C++):

Манипуляторы и флаги формата - C++
1.Манипулятор right почемуто не производит вывод по правой стороне. В чем проблема? рис. 1 2.Манипулятор skipws должен отбрасывать...

Манипуляторы ввода-вывода. Флаги - C++
Здравствуйте. Моя задача такова: нужно сделать программу, которая будет ждать ввода числа в 16-ричной, 8-ричной или 10-тичной системе...

Пользовательские флаги формата потока и манипуляторы - C++
Всем здравствуйте, возникла такая вот проблема: не понимаю как правильно создать свой флаг формата и правильно указать его для потока...

Флаги форматирования cout - C++
В чем разница, кроме того, что первые два флага форматирования задаются в качестве манипуляторов? cout &lt;&lt; setiosflags(ios::fixed); ...

Флаги форматирования в cout, выравнивание справа - C++
Вот код. Я установил флаг форматирования райт. Поток перегружен и на консоль выводится площадь и периметр, вот только они нисколько не...

Манипуляторы - C++
Ребята, проблема с манипуляторами.. Вместо того чтобы были пустые места, программа выдает нули(( void view(HANDLE hrFile) { ...

45
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.09.2009, 02:56 #2
Заглянул в ios_base,там ещё есть
флаги
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     *  - boolalpha
     *  - dec
     *  - fixed
     *  - hex
     *  - internal
     *  - left
     *  - oct
     *  - right
     *  - scientific
     *  - showbase
     *  - showpoint
     *  - showpos
     *  - skipws
     *  - unitbuf
     *  - uppercase
     *  - adjustfield
     *  - basefield
     *  - floatfield

Вот тут описывается их смысл http://www.cplusplus.com/reference/iostream/ios_base/fmtflags/
2
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,869
09.09.2009, 11:28 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ещё можно "на лету" ширину выводимого поля менять:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>
using namespace std;
 
int main(){
    cout << left << setw(3) << "#" << setw(20) << "Name" << setw(30) << "Surname" << endl;
    cout << setw(3) << "01" << setw(20) << "Vasiliy" << setw(30) << "Nihrenasebefamiliya" << endl;
    cout << setw(3) << "02" << setw(20) << "Ferapontiy" << setw(30) << "Ivanov-Petrov-Sidorov" << endl;
    
    return(0);
}
8
smile2me
0 / 0 / 0
Регистрация: 05.04.2010
Сообщений: 6
07.04.2010, 01:50 #4
Как установить точность выводимого решения?
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
07.04.2010, 02:00  [ТС] #5
smile2me, в каком смысле точность? Количество знаков после десятичной точки, округление до определенного разряда или что?
2
smile2me
0 / 0 / 0
Регистрация: 05.04.2010
Сообщений: 6
07.04.2010, 02:26 #6
M128K145,Кол-во знаков после запятой.Ширина поля 10 символов,точность 4 цифры,а вместо пробелов %

как это граммотно сделать?
0
nomaster
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 14
24.06.2011, 11:34 #7
у меня такой вопрос: по идее этот флаг
C++
1
2
std::cout.flags(std::ios::scientific);
std::cout<<_double<<std::endl;
должен же выводить на экран дробь в её нормальном виде(насколько я понял), почему тогда на экран выводится:
4.118223е + 000
как сделать чтобы дробь выводилась на экран в виде обычной дроби???
0
Bers
Заблокирован
24.06.2011, 11:46 #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void SetConsole()
{
    SetConsoleOutputCP(1251);    SetConsoleCP(1251); //не удалять! Русский букв!!!
    using namespace std; //без этой строки коуты не пашут
    cout.setf(ios::fixed,ios::floatfield); //увеличивает точность показа дробной части в консоли
}
 
 
void main (void)
{
    SetConsole(); 
        ....
}
0
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,838
Записей в блоге: 28
24.06.2011, 12:51 #9
nomaster, что ты называешь словом "дробь"?
0
nomaster
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 14
24.06.2011, 12:59 #10
напримет 1/2!!!! мне нужен вывод дроби в таком виде
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.06.2011, 13:09 #11
nomaster, Ну пиши класс/функцию переводящую десятичную дробь в обыкновенную. Стандартного такого вывода нет.
0
grizlik78
Эксперт С++
1972 / 1465 / 122
Регистрация: 29.05.2011
Сообщений: 3,033
24.06.2011, 13:12 #12
Даже более того — поскольку ни флоат, ни дабл не способны точно хранить произвольное рациональное число, то для работы с рациональными числами их хранят в целых числах в виде числителя и знаменателя. А уж при необходимости переводят в десятичную дробь для вывода
0
nomaster
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 14
24.06.2011, 13:23 #13
только хотелось бы видеть её в вертикальном естестенном виде, если это конечно возможно!

Добавлено через 1 минуту
Класс мне писать нельзя(
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.06.2011, 13:35 #14
nomaster, прям нельзя? врожденная боязнь классов?
0
nomaster
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 14
24.06.2011, 13:41 #15
по ЯВУ запретили, даже в курсаче нельзя использовать!
классы у нас используются в ООП
0
24.06.2011, 13:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2011, 13:41
Привет! Вот еще темы с ответами:

манипуляторы - C++
Создайте свои манипуляторы которые будут выполнять 1)вывод всех символов равных заданному заменить пробелом 2)вывод всех символов...

Манипуляторы. От С к С++ - C++
fprintf(f1, “%-7.3е”, x) Какая эквивалентная запись этой на С++?

манипуляторы - C++
Создайте манипулятор ввода skipcbar(), который, поочередно, то считывает, то пропускает каждые десять символов потока ввода.

Манипуляторы в С++ - C++
___________________Манипуляторы______________________ - endl_________________перевод строки - flush________________выгружает содержимое...


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

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

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