Программирование >>  Программирование на языке c++ 

1 ... 103 104 105 [ 106 ] 107 108 109 ... 159


определенный в самом языке). Если оператор используется для новых типов данных, то при его доопределении необходимо предусмотреть соответствующие проверки.

Рассмотренные выше функции возвращают истинное (ненулевое) или ложное (нулевое) значения в зависимости от состояния потока. Истинное (ненулевое) значение возвращается, если:

ios::badbit ios::hardfail == 1 для bad() функции; ios::eofbit == 1 для eof() функции;

ios::failbit ios::badbit ios::hardfail == 1 для failQ функции; все биты состояния потока в нуле для good() функции.

В заключение заметим, что в классе ios есть две полезные функции (clear и rdstate), которые соответственно позволяют установить в нуль и прочитать состояние потока (см. § 8.7).

Рассмотрим примеры. Первый из них показывает, как можно проверить правильность ввода данных из входного потока.

#include <iostream.h> #include <stdlib.h> void nnain{void)

{ int flags; здесь будет храниться состояние потока int integer; в эту переменную будет вводиться целое значение

cout enter something\n ; введите какое-то значение cin >> integer; выполнение ввода

flags = cin.rdstateO; чтение состояния потока

if{flags) проверка наличия ошибки

if(flags & ios::badbit) очистка потока

{ cout badbit\n ;

cin.clear(O); }

else завершение программы по критической ошибке

{ cerr << Can not handle that error\n ;

abortO; }

cout stream is in a good state\n ; не было ошибки cout integer endl; вывод введенного значения



В программе читается значение состояния потока. Если это значение отлично от нуля, то произошла какая-то ошибка.

Вторая программа выполняет те же действия, но в ней не используется функция rdstate().

#include <iostream.h> #include <stdlib.h> void main(void) { int integer;

cout enter something\n ;

cin >> integer;

if(!cin) проверка наличия ошибки

if( cin.badO )

{ cout badbit\n ;

cin.clear(O); }

else

{ cerr Can not handle that error\n ;

abortO; }

cout << stream is in a good state\n ; cout integer endl;

8.5. Форматирование

Рассмотрим различные операции вывода. При этом всегда используется форматирование, т. е. представление результата на экране дисплея в определенной форме. Различные формы позволяют вывести данные в различных системах счисления, с различной точностью, с использованием разных критериев выравнивания и т. п.

Функции, используемые для форматирования, включены в класс ios, который является базовым для классов istream и ostream (см. рис. 8.2). Рассмотрим некоторые из этих функций (все они имеют атрибут public).

Функция width(int) позволяет установить минимальную ширину поля, используемую для вывода очередного значения, например:

cout. width(10);

cout [ 12345 ];

И В. А. Скляров



В результате число 12345 будет выведено в поле шириной 10 символов:

[ 12345]

Функция width оказывает влияние только на первое выводимое значение, поэтому следующие строки:

cout. width(IO);

cout [ 12345 ] [ 12345 ]; дают такой результат: [ 12345][12345]

По умолчанию минимальная ширина задается равной нулю. Это означает, что ширина поля равна действительному числу выводимых элементов.

Пробелы можно заполнить символами, если использовать функцию ffll(char). По умолчанию в качестве символа заполнителя задается пробел. Рассмотрим пример:

cout. width(IO);

cout.fillC-);

cout [ 12345 ]; Теперь результат будет представлен в таком виде: [-----12345]

Функции flags и setf используются для установки и проверки специальных признаков форматирования. Эти признаки задаются в виде перечисления в классе ios:

public:

enum {

skipws, пропускает пробелы, табуляцию и т. п. left, выравнивание по лево11 границе right, выравнивание по правой границе internal, выравнивание между знаком и значением dec, число в десятичном формате

oct, число в восьмеричном формате

hex, число в шестнадцатеричном формате

showbase, вывод системы счисления showpoint, выводит отсутствующие нули uppercase, использует заглавные буквы при выводе формата (Е и X)



1 ... 103 104 105 [ 106 ] 107 108 109 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика