Справочные данные по языку C++___________________________647

В предыдущих примерах выводились константы и константные выражения.
При выводе переменных все работает точно так же. Например, операторы

int i = 25, j = 2;

outfile « i « " * " « j « " = " « (i * j) « endl;

и операторы

int i = 25, j = 2;

char s[80] = "25 * 2 = ";

outfile « s « (i * j) « endl;

выводят в файл один и тот же текст: «25 * 2 = 50».

Предыдущий пример показывает, что вывод строки типа char * осуществляет-
ся просто записью в качестве правого операнда указателя на эту строку. Однако,
для строк типа AnsiString (см. соответствующий раздел в главе 15) операция «
не перегружена. Поэтому при выводе таких строк надо использовать приведение ее
к типу char * с помощью метода c_str:

AnsiString sa = "Это строка AnsiString";

outfile « sa.c_str() « endl;

При выводе могут использоваться и достаточно сложные выражения. В приве-
денном ниже примере предполагается наличие двух окон редактирования Editi и
Edit2, в которые пользователь вводит целые числа, а программа выводит резуль-
тат их сравнения:

int i = StrToInt(Editl->Text);

int j = StrToInt(Edit2->Text) ;

outfile « i « (i == j ? " " : " не ") « "равно " « j
« endl;

В зависимости от введенных чисел будет выведен текст «... равно ...» или «...
не равно ...».

Обратите внимание на то, что условный оператор заключен в скобки. Это необ-
ходимо делать, поскольку операция поместить в поток имеет сравнительно высо-
кий приоритет (см. раздел 11.7.15) и без скобок она применилась бы только к пере-
менной i, что вызвало бы сообщение о синтаксической ошибке.

Операция « позволяет выводить и указатели. Например, вы можете напи-
сать оператор

outfile « Memol endl;

и он выведет текст типа «0063F610» — шестнадцатеричный адрес объекта Memol.
Особым приемом надо выводить при необходимости указатель на строку типа char
*. Если записать в операции поместить в поток сам указатель, например, s, то вы-
ведется не указатель, а содержимое строки. Так перегружена операция « при вы-
воде строк. Если же нужен именно адрес, то перед именем указателя надо помес-
тить операцию приведения типа (void *). Например:

outfile « (void *)s « endl;

Рассмотренные выше примеры далеко не исчерпывают возможностей вывода с
помощью операции «. При выводе можно использовать немало манипуляторов
потоков, позволяющих форматировать текст, выводимый операцией «. Ранее
был рассмотрен только один манипулятор потока — endl. Описание других мани-
пуляторов приведено в главе 12 в разделе 12.9.3.2.

Теперь остановимся на операции взять из потока (»). Эта операция извлекает
данные из потока, заданного ее левым операндом, и заносит их в переменную, за-
данную правым операндом. Операция возвращает поток, указанный как ее левый
операнд. Благодаря этому допускаются сцепленные операции взять из потока. На-
пример, оператор