- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
C++ - Страустрап Бьярн
Шрифт:
Интервал:
Закладка:
// описать подходящее пространство буфера char cout_buf[BUFSIZE]
// сделать «filebuf» для управления этим пространством //связать его с UNIX'овским потоком вывода 1 (уже открытым) filebuf cout_file(1,cout_buf,BUFSIZE);
// сделать ostream, обеспечивая пользовательский интерфейс ostream cout( amp;cout_file);
char cerr_buf[1];
// длина 0, то есть, небуферизованный
// UNIX'овский поток вывода 2 (уже открытый) filebuf cerr_file(2,cerr_buf,0);
ostream cerr( amp;cerr_file);
Примеры двух других конструкторов ostream можно найти в #8.3.3 и #8.5.
8.3.2 Закрытие потоков вывода
Деструктор для ostream сбрасывает буфер с помощью откртого члена функции ostream::flush():
ostream::~ostream() (* flush(); // сброс *)
Сбросить буфер можно также и явно. Например:
cout.flush();
8.3.3 Открытие файлов
Точные детали того, как открываются и закрываются файлы, различаются в разных операционных системах и здесь подробно не описываются. Поскольку после включения «stream.h» станвятся доступны cin, cout и cerr, во многих (если не во всех) программах не нужно держать код для открытия файлов. Вот, онако, программа, которая открывает два файла, заданные как параметры командной строки, и копирует первый во второй:
#include «stream.h»
void error(char* s, char* s2) (* cerr «„ s «« " " «« s2 «« «n“; exit(1); *)
main(int argc, char* argv[]) (* if (argc != 3) error(«неверное число параметров»,"");
filebuf f1; if (f1.open(argv[1],input) == 0) error(«не могу открыть входной файл»,argv[1]); istream from( amp;f1);
filebuf f2; if (f2.open(argv[2],output) == 0) error(«не могу создать выходной файл»,argv[2]); ostream to( amp;f2);
char ch; while (from.get(ch)) to.put(ch);
if (!from.eof() !! to.bad()) error(«случилось нечто странное»,""); *)
Последовательность действий при создании ostream для именованного файла та же, что используется для стандартных потоков: (1) сначала создается буфер (здесь это делается поредством описания filebuf); (2) затем к нему подсоединяется файл (здесь это делается посредством открытия файла с помощью функции filebuf::open()); и, накрнец, (3) создается сам
ostream с filebuf в качестве параметра. Потоки ввода обрабтываются аналогично.
Файл может открываться в одной из двух мод:
enum open_mode (* input, output *);
Действие filebuf::open() возвращает 0, если не может окрыть файл в соответствие с требованием. Если пользователь пытается открыть файл, которого не существует для output, он будет создан.
Перед завершением программа проверяет, находятся ли птоки в приемлемом состоянии (см. #8.4.2). При завершении программы открытые файлы неявно закрываются.
Файл можно также открыть одновременно для чтения и запси, но в тех случаях, когда это оказывается необходимо, пардигма потоков редко оказывается идеальной. Часто лучше расматривать такой файл как вектор (гигантских размеров). Можно определить тип, который позволяет программе обрабатывать файл как вектор, см. Упражнения 8– 10.
8.3.4 Копирование потоков
Есть возможность копировать потоки. Например:
cout = cerr;
В результате этого получаются две переменные, ссылающися на один и тот же поток. Гавным образом это бывает полезно для того, чтобы сделать стандартное имя вроде cin ссылающимся на что-то другое (пример этого см. в #3.1.6)
8.4 Ввод
Ввод аналогичен выводу. Имеется класс istream, который предоставляет операцию »» («взять из») для небольшого мнжества стандартных типов. Функция operator»» может опредляться для типа, определяемого пользователем.
8.4.1 Ввод встроенных типов
Класс istream определяется так:
class istream (* // ... public: istream amp; operator»»(char*); // строка istream amp; operator»»(char amp;); // символ istream amp; operator»»(short amp;); istream amp; operator»»(int amp;); istream amp; operator»»(long amp;); istream amp; operator»»(float amp;); istream amp; operator»»(double amp;); // ... *);
Функции ввода определяются в таком духе:
istream amp; istream::operator»»(char amp; c); (* // пропускает пропуски int a; // неким образом читает символ в "a" c = a; *)
Пропуск определяется как стандартнчй пропуск в C, через вызов isspase() в том виде, как она определена в «ctype.h» (пробел, табуляция, символ новой строки, перевод формата и возврат каретки).
В качестве альтернативы можно использовать функции get():
class istream (* // ... istream amp; get(char amp; c); // char istream amp; get(char* p, int n, int ='n'); // строка *);
Они обрабатывают символы пропуска так же, как остальные символы. Функция istream::get(char) читает один символ в свой параметр; другая istream::get читает не более n символов в вектор символов, начинающийся в p. Необязательный третий праметр используется для задания символа остановки (иначе, терминатора или ограничителя), то есть этот символ читаться не будет. Если будет встречен символ ограничитель, он остнется как первый символ потока. По умолчанию вторая функция get будет читать самое большее n символов, но не больше чем одну строку, 'n' является ограничителем по умолчанию. Необзательный третий параметр задает символ, который читаться не будет. Например:
cin.get(buf,256,'t');
будет читать в buf не более 256 символов, а если встртится табуляция ('t'), то это приведет к возврату из get. В этом случае следующим символом, который будет считан из cin, будет 't'.
Стандартный заголовочный файл «ctype.h» определяет неколько функций, которые могут оказаться полезными при осществлении ввода:
int isalpha(char) // 'a'..'z' 'A'..'Z' int isupper(char) // 'A'..'Z' int islower(char) // 'a'..'z' int isdigit(char) // '0'..'9' int isxdigit(char) // '0'..'9' 'a'..'f' 'A'..'F' int isspase(char) // ' ' 't' возврат новая строка // перевод формата int iscntrl(char) // управляющий символ // (ASCII 0..31 и 127) int ispunct(char) // пунктуация:ни один из вышеперечисленных int isalnum(char) // isalpha() ! isdigit() int isprint(char) // печатаемый: ascii ' '..'-' int isgraph(char) // isalpha() ! isdigit() ! ispunct() int isascii(char c) (* return 0«=c amp; amp; c«=127; *)
Все кроме isascii() реализуются внешне одинаково, с прменением символа в качестве индекса в таблице атрибутов символов. Поэтому такие выражения, как
(('a'«=c amp; amp; c«='z') !! ('A'«=c amp; amp; c«='Z')) // алфавитный
не только утомительно пишутся и чреваты ошибками (на мшине с набором символов EBCDIC оно будет принимать неалфавиные символы), они также и менее эффективны, чем применение стандартной функции:
isalpha(c)
8.4.2 Состояния потока
Каждый поток (istream или ostream) имеет ассоциированное с ним состояние, и обработка ошибок и нестандартных условий осуществляется с помощью соответствующей установки и проверки этого состояния.
Поток может находиться в одном из следующих состояний:
enum stream_state (* _good, _eof, _fail, _bad *);
Если состояние _good или _eof, значит последняя операция ввода прошла успешно. Если состояние _good, то следующая опрация ввода может пройти успешно, в противном случае она зкончится неудачей. Другими словами, применение операции ввода к потоку, который не находится в состоянии _good, является пустой операцией. Если делается попытка читать в переменную v, и операция оканчивается неудачей, значение v должно отаться неизменным (оно будет неизменным, если v имеет один из тех типов, которые обрабатываются функциями членами istream или ostream). Отличие между состояниями _fail и _bad очень незначительно и предсавляет интерес только для разработчиков операций ввода. В состоянии _fail предполагается, что поток не испорчен и никакие символы не потеряны. В состоянии _bad может быть все что угодно.

