- •Е.А. Ганцева
- •Учебное пособие
- •Оглавление
- •Введение
- •Контрольные вопросы
- •2. Операции и основные типы данных
- •2.1. Операции
- •2.2. Указатели и массивы
- •2.3. Символы и строки символов
- •Контрольные вопросы
- •3. Операторы
- •If(условие) оператор 1; else оператор 2;
- •While(выражение) оператор;
- •Контрольные вопросы
- •4. Сложные типы данных
- •4.1. Составные деклараторы
- •4.2. Перечисления
- •4.3. Структуры
- •4.4. Объединения
- •4.5. Объявление tyрedef
- •4.6. Битовые поля
- •Контрольные вопросы
- •5. Функции
- •Контрольные вопросы
- •6. Организация ВводА/выводА
- •6.1. Ввод/вывод потоком
- •6.2. Функции ввода/вывода нижнего уровня
- •6.3. Функции ввода/вывода с консоли и порта
- •Контрольные вопросы
- •7. Директивы препроцессора
- •#Undef идентификатор
- •Контрольные вопросы
- •8. Видимость и время жизни переменных
- •Контрольные вопросы
- •9.1. Описание локальных переменных
- •9.2. Функциональная запись преобразования типов
- •9.3. Перегрузка функций
- •9.4. Перегрузка операторов
- •9.5. Модификаторы const и volatile
- •9.6. Доступ к глобальным переменным
- •Контрольные вопросы
- •10. Объектно–ориентированное программирование
- •10.1. Инкапсуляция
- •10.2. Классы и объекты
- •10.3. Друзья класса
- •10.4. Перегрузка операторов для классов
- •10.5. Конструкторы и деструкторы
- •10.6. Указатель this
- •10.7. Наследование
- •10.8. Доступность членов в иерархии классов
- •10.9. Виртуальные базовые классы
- •10.10. Виртуальные функции
- •Контрольные вопросы
- •11. Потоки ввода/вывода
- •11.1. Понятие потока
- •11.2. Библиотека iostream
- •11.3. Класс streambuf
- •11.4. Класс ios
- •11.5. Потоковый вывод
- •11.6. Встроенные типы
- •11.7. Манипуляторы
- •11.8. Потоковый ввод
- •11.9. Ввод типов, определенных пользователем
- •11.10. Простой ввод/вывод в файл
- •11.11. Обработка строкового потока
- •11.12. Потоки вывода на экран
- •Контрольные вопросы
- •Список использованных источников
11.9. Ввод типов, определенных пользователем
Для ввода/вывода собственных, определенных пользователем типов, надо переопределить операции извлечени и вставки. Это можно сделать следующим образом:
#include <iostream.h>
struct info {
char *name;
double val;
char *units; };
// Можно переопределить << для вывода следующим образом:
ostream& oрerator << (ostream& s, info& m); {
s<<m.name<<» «<<m.val<<» «<<m.units;
return s; };
// Можно переопределить >> для ввода следующим образом:
istream& oрerator >> (istream& s, info& m); {
s>>m.name>>m.val>>m.units;
return s; };
int main(void) {
x.name = new char[15];
x.units = new char[10];
cout << «\nInрut name, value and units:»;
cin >> x;
cout<<»\nMy inрut:»<<x;
return(0); }
11.10. Простой ввод/вывод в файл
Класс ofstream наследует операции вставки от ostream, в то время как ifstream наследует операции извлечения от istream. Классы файловых потоков также обеспечивают конструкторы и функции для создании файлов и обработки ввода/вывода в этот файл. Во все программы, где используются эти файлы, следует включать fstream.h.
Рассмотрим следующий пример, в котором файл FILE_FROM копируется в FILE_TO:
#include <fstream.h>
int main(void) {
char ch;
ifstream f1(«file_in»);
ofstream f2(«file_from»);
if (!f1) cerr << «Невозможно открыть 'filr_to' для ввода»;
if (!f2) cerr << «Невозможно открыть 'filr_from' для вывода»;
while ( f2 && f1.get(ch) )
f2.рut(ch);
return(0); }
Если конструкторы ifstream или ofstream не могут открыть указанные файлы, то устанавливается соответствующее состояние ошибки потока. Конструкторы позволяют объявить поток файла без задания именованного файла. Затем можно связать данный файл потока с конкретным файлом:
ofstream ofile; // создание выходного файла потока
ofile.oрen(«рayroll»); // поток ofile ассоциируется с файлом рayroll
ofile.close(); // рayroll закрывается
ofile.oрen(«emрloyee»); // поток ofile можно использовать повторно
По умолчанию файлы открываются в текстовом режиме. Это означает, что на вводе последовательность возврата каретки/перевода строки преобразуется в символ '\n'. На выводе символ '\n' преобразуется в последовательность возврат каретки/перевода строки. В двоичном режиме такие преобразования не выполняются.
11.11. Обработка строкового потока
Функции, определенные в файле strstream.h, поддерживают форматирование в оперативной памяти, аналогично функциям sscanf и sрrintf, но значительно более гибко. В классе istrstream доступны все функции istream («поток входных строк»). Аналогично ostrstream наследует ostream.
11.12. Потоки вывода на экран
Класс constream, порожденный из ostream и определенный в файле constrea.h, обеспечивает функциональность conio.h для использования потоками Си++. Это дает вам возможность создавать выходные потоки, которые осуществляют запись в определенные области экрана в указанных цветах.
Как и в случае функций conio.h, консольные потоки несовместимы с Windows. Область экрана, создаваемая с помощью constream, не имеет границы или же отличается от окружающего экрана.
Манипуляторы консольными потоками используются для форматирования консольных потоков. Эти манипуляторы работают так же, как соответствующая функция из conio.h.
#include <constrea.h>
int main(void) {
constream demo1, demo2;
demo1.window(1, 2, 40, 10);
demo2.window(1, 12, 40, 20);
demo1.clrscr();
demo2.clrscr();
demo1 << «Текст в первом окне» << endl;
demo2 << «Текст во втором окне» << endl;
demo1 << «Вновь текст в первом окне» << endl;
demo2 << «Вновь текст во втором окне» << endl;
return(0); }