
- •1. Объявление класса. Примеры. Понятие инкапсуляции, полиформизма, наследования.
- •2. Доступ к членам класса. Управление доступом к членам класса. Указатель this. Примеры.
- •3. Конструкторы и деструкторы. Параметризованные конструкторы. Примеры.
- •4. Дружественные ф-ции. Примеры.
- •5. Перегрузка функций. Значение аргументов ф-ции по умолчанию. Примеры.
- •6. Наследование. Примеры.
- •7. Передача объектов в ф-ции и возврат объекта из ф-ции. Массивы объектов. Примеры.
- •8. Перегрузка операторов при помощи функций-членов класса. Примеры.
- •9. Перегрузка операторов при помощи дружественных ф-ций. Примеры.
- •10. Ссылки, ссылки на объекты. Примеры.
- •11. Конструктор копирования. Примеры
- •12. Наследование и спецификаторы доступа. Примеры.
- •13. Конструкторы и деструкторы производных классов. Примеры.
- •14. Указатели и ссылки на производные типы. Примеры.
- •Ссылки на производные классы
- •15. Виртуальные ф-ции. Примеры.
- •16. Чисто виртуальные ф-ции и абстрактные классы. Примеры.
- •17. Обработка исключений. Примеры.
- •18. Создание собственных операторов вставки и извлечения. Примеры.
- •19. Файловый ввод-вывод. Примеры.
- •20. Формирование ввода-вывода. Примеры.
- •21. Двоичные файлы. Примеры.
- •22. Произвольный доступ. Примеры.
- •23. Ввод-вывод в массивы Примеры.
- •24. Класс string. Примеры.
- •25. Функции-шаблоны. Примеры.
- •Явная перегрузка функций-шаблонов
- •26. Классы-шаблоны. Примеры.
- •27. Пространства имён. Примеры.
- •28. Статические члены класса. Примеры.
- •30. Идентификация типа во время исполнения. Примеры.
- •31. Новые операторы приведения типов. Примеры.
- •32. Контейнерные классы. Примеры.
20. Формирование ввода-вывода. Примеры.
Форматирование с помощью функций-членов ios
В заголовочном файле iostream определены флаги форматирования, которые можно всегда найти в справочниках. Эти значения используются для установки или сброса флагов, управляющих форматированием информации потоков. Для установки флагов используется функция setf(), чей прототип имеет вид:
long setf(long flags);
Эта функция возвращает предыдущее значение флага, устанавливая его новое значение равным flags. При этом остальные флаги остаются неизменными.
Пример
stream.setf(ios::showpos);
Здесь stream является потоком, на который надо оказать воздействие.
Пример
#include <iostream>
using namespace std;
int main()
{
cout.setf(ios::showpos);
cout.setf(ios::scientific);
cout << 123 << " " << 123.23 << " ";
getchar();
return 0;
}
Данная программа выводит на экран
+123 +1.232300е+002
Для отключения флагов надо использовать функцию unsetf(). Она имеет следующий прототип:
long unsetf(long flags);
Функция возвращает значение предыдущей установки флага и сбрасывает флаги, определяемые параметром flags. Иногда бывает полезным знать текущую установку флагов. Для этого служит функция flags().
Прототип: long flags();
Кроме флага форматирования также можно установить ширину поля потока, символ для заполнения и число цифр после запятой. Для этого используются следующие функции:
int width(int len);
char fill(char ch);
int precision(int num);
21. Двоичные файлы. Примеры.
Сохранение в двоичных файлах данных стандартных типов.
Двоичные файлы более компактны и в некоторых случаях более удобны для обработки.Для того, чтобы открыть двоичный файл, необходимо задать режим доступа ios::binary (в некоторых компиляторах С++ - ios::bin).
Для создания выходного файла создают объект
ofstream out_fil("Outfil.dat", ios::out | ios::binary);
if (!out_fil) { cerr << "Error: Outfil.dat" << endl;
exit(1);
}
Для того, чтобы открыть существующий двоичный файл для чтения, нужно создать объект
ifstream in_fil("Infil.dat", ios::in | ios::binary);
if (!in_fil) { cerr << "Error: Infil.dat" << endl;
exit(2);
}
Пример.Запись значения типа double в двоичный файл.
# include <fstream>
# include <iostream>
using namespace std;
# include <stdlib.h>
class bin_outstream:public ofstream
{public:
bin_outstream(const char *fn): ofstream(fn, ios::out | ios::binary) {}
void writeOurDate(const void*, int);
ofstream &operator<<(double d) { writeOurDate(&d, sizeof(d));
return *this;
}
};
int main()
{ bin_outstream bin_out("B_out.dat");
if (!bin_out) { cerr << "Unable to write to B_out.dat" << endl;
exit(1);
}
double d = 5.252;
bin_out << d;
bin_out << d*d;
d = 5.2E-5;
bin_out << d;
return 0;
}
void bin_outstream:: writeOurDate(const void *Ptr, int len)
{ if (!Ptr) return;
if (len <= 0) return;
write((char*)Ptr, len);
}
Пример 24.2. Чтение значений типа double из двоичного файла.
#include <fstream>
#include <iostream>
using namespace std;
#include <stdlib.h>
class bin_instream: public ifstream
{ public:
bin_instream(const char *fn): ifstream(fn, ios::in | ios::binary) {}
void readOurDate(void*, int);
bin_instream &operator>>(double &d) { readOurDate(&d, sizeof(d));
return *this;
}
};
int main()
{ bin_instream bin_in("B_in.dat");
if (!bin_in) { cerr << "Unable to open B_in.dat" << endl;
exit(1);
}
double d;
long count = 0;
bin_in >> d;
while (!bin_in.eof()) { cout << ++count << ":"<< d << endl;
bin_in >> d;
}
return 0;
}
void bin_instream:: readOurDate(void *p, int len)
{ if (!p) return;
if (len <= 0) return;
read((char*)p, len);
}
Сохранение в двоичных файлах данных, имеющих тип, создаваемый пользователем.
Иногда возникает необходимость сохранить в файле данные, структура которых задается программистом. В этих случаях задают класс, содержащий данные и функции, перегружающие операторы ввода и вывода под эти данные.
Пример.
Объявим структуру
struct mountine {char name[20]; //название горы
int altitude; //высота над уровнем моря
int complicate; //сложность
};
mountine mount;
Для сохранения такой структуры в текстовом файле необходимо выполнить следующие действия:
ofstream fil_out("mountines.txt", ios_base::app);
fil_out << mount.name << " " << mount.altitude << ' ' << mount.complicate << "\n";
Для сохранения той же информации в двоичном файле выполняют следующее:
ofstream fil_out("mountines.dat", ios_base::app | ios_base::binary);
fil_out.write((char *) &mount, sizeof(mountine));
Метод write копирует указанное число байтов (в данном случае – sizeof(mountine)) в файл из памяти ЭВМ. Несмотря на то, что сохранение данных происходит в двоичном файле, адрес переменной преобразуется к указателю на тип char.
Для чтения данных из двоичного файла используют метод read:
ifstream fil_in("mountines.dat", ios_base::binary);
fil_in.read((char *) &mount, sizeof(mountine));
При записи или чтении классов, не содержащих виртуальных функций, можно использовать тот же самый подход. Чтобы сделать класс потоковым, нужно перегрузить операторы << и >>:
friend ostream &operator<<(ostream &, AnyClass &);
friend istream &operator>>(istream &, AnyClass &);