выведет значение р в виде длинного целого. Это может принести пользу при
отладке, но, вероятно, не все компиляторы C++ и операционные системы дадут
аналогичный результат.

    Форматный вывод с помощью потоков ввода-вывода

    Библиотека потоков ввода-вывода понимает множество команд форматного
вывода (некоторые из них обсуждались в главе 15). Листинг 12.6 демонстрирует
возможность использования трех идентификаторов выходного потока — dec, hex, и
oct — для вывода целых значений в десятичном, шестнадцатеричном и восьмеричном
форматах.

    Листинг 12.6. CONVERT.CPP (использование форматного вывода в потоках ввода-вывода)

    1:	#include <iostream.h>
    2:	#include <stdlib.h>
    3:
    4:	#define SIZE 35
    5:
    6:	main()
    7:	{
    8:	  int value;
    9:	  char s[SIZE];
    10:
    11:	  cout « "Value? ";
    12:	  cin.get(s, SIZE, '\n')
    13:	  value = atoi(s);
    14:	  cout « "Decimal=" «	dec « value
    15:	  « "Hexadecimal=0x" «	hex « value
    16:	  « "Octal=0" « oct «	value « '\n' ;
    17:	  return 0;
    18:	}

    Строки 14-16 выводят в один и тот же поток различные данные. Одни из них —
строки символов. Другие — целые числа. Идентификаторы dec, hex, и oct,
выведенные в поток непосредственно перед выводом значения, изменяют текущий
формат вывода выходного потока.
    Кроме того, вы можете указать и ширину вывода с помощью вызова
cout.width(n), где п — нужное число позиций. Например, можно вывести значение
в 15 позициях с выравниванием по правому краю, написав следующий участок кода:

    int value = 1234;	// Форматируемое значение
    cout.width(15);	// Указать вывод в 15 позициях
    cout « value;	// Вывод значения в 15 позициях

    Иногда бывает неудобно пользоваться форматным выводом библиотеки потоков.
Ее сложные операторы могут быть трудными для чтения. Судя по обнародованным
исходным текстам, программисты-эксперты в C++ предпочитают смесь методов
форматирования вывода ANSI С и C++. Листинг 12.7 — типичный случай такого
подхода, он полностью аналогичен CONVERT. СPP.


    Листинг 12.7.  CONVERT2.CPP (альтернативный вариант форматного вывода)

    1:    #include <iostream.h>
    2:    #include <stdio.h>
    3:    #include <stdlib.h>
    4:
    5:    #define SIZE 35
    6:
    7:    main()
    8:    {
    9        int value;
    10:      char s[SIZE];
    11:      char buffer[80];
    12:
    13:      cout « "Value? ";
    14:      cin.get(s, SIZE, '\n');
    15:      value = atoi(s);
    16:      sprintf(buffer,"Decimal=%d Hexadecimal=%#x Octal=%#o\n"
    17:      value, value, value);
    18:      cout « buffer;
    19:      return 0;
    20:   }

Сложный оператор вывода библиотеки потоков из CONVERT. CPP заменен вызовом
sprintf() в строках 16-17. Функция sprintf(), описанная в STDLIB.H, готовит
символьную строку согласно тем же правилам, ко-


    Глава 12. Введение в C++     285 
