
- •1.2Типы данных
- •1.2.1Объявление переменной
- •1.2.2Категории типов данных
- •1.2.3Целый тип данных
- •1.2.4Данные с плавающей точкой (вещественные типы)
- •1.3Знаки операций
- •1.3.3Простое присваивание
- •1.3.4Составное присваивание
- •1.3.5Приоритеты операций и порядок вычислений
- •1.4Структура и компоненты программы на языке си
- •1.5Организация ввода-вывода в стиле си
- •1.6.1 Манипуляторы и форматирование ввода-вывода
- •1.7Математические функции
- •2Алгоритм. Элементы структурного программирования
- •2.1Понятие алгоритма
- •2.2Основные требования к алгоритмам
- •2.3Элементы структурного программирования
- •3Программирование алгоритмов линейной структуры
- •4Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
- •4.1Алгоритмы и программы ветвящейся структуры
- •4.1.1Условный оператор if
- •If (выражение) оператор1;
- •4.1.2Логические операции
- •4.2Примеры составления алгоритмов и программ с использованием условного оператора If
- •4.3Переключатель switch
- •5Алгоритмы и программы циклической структуры
- •5.1 Понятие цикла. Разновидности циклов
- •5.3Оператор while
- •5.4Оператор do while
- •5.5Оператор continue
- •6Регулярные типы данных. Массивы
- •6.1 Понятие регулярного типа
- •6.2Алгоритмы сортировки массивов
- •6.3 Постановка задачи сортировки и методы её решения
- •6.4Алгоритм прямого упорядочения (Алгоритм сортировки выбором элемента)
- •6.5Алгоритм попарного сравнения соседних элементов («пузырьковая» сортировка)
- •6.6Алгоритм сортировки выбором элемента
- •6.7Методы доступа к элементам массивов, использование указателей
- •6.8Организация многомерных массивов. Указатели на многомерные массивы
- •7.1Описание и определение функции
- •7.2Вызов функции
- •7.3Передача параметров в функцию
- •7.4Описание прототипа функции
- •7.5Функция с переменным количеством параметров
- •7.6Понятие сигнатуры функции
- •7.7Подставляемые (встраиваемые) функции
- •7.8Передача параметров в главную функцию
- •7.9Рекурсивные вызовы функции
- •7.10Примеры составления функций
- •8Указатели
- •8.1Понятие указателя
- •8.2Инициализация указателей
- •8.3Операции с указателями
- •8.4Ссылки
- •9Структуры (struct)
- •10Динамические структуры данных
- •3.1 Односвязные списки
- •Д обавление в начало списка.
- •2 ) Добавление в середину списка.
- •У даление первого элемента списка.
- •3 )Удаление элемента из середины списка.
- •Int Data; //поле данных
- •If (!q) //...И он первый в списке
- •3.2 Стек
- •3.3 Очередь
- •11Динамические массивы
- •12Функции и массивы
- •13Указатели на функции
- •14.1Файловый ввод/вывод с помощью потоков
- •14.2 Дополнительные функции файлового ввода/вывода
- •14.3Режимы файлов
- •14.4 Двоичные файлы
- •14.5Произвольный доступ к файлам
- •Список использованных источников
14.3Режимы файлов
Режим файла описывает, как используется файл: для чтения, для записи, для добавления и т.д. Когда поток связывается с файлом, а также при инициализации файлового потокового объекта именем файла или при работе с функцией open(), можно использовать и второй аргумент, задающий режим файла:
ifstream fin(“file1.txt”,ios::in);
ofstream fout;
fout.open(“file2.dat”,ios::app);
В С++ определено несколько констант, которыми можно воспользоваться для указания режима файла. Список этих констант и их значений приведен в таблице 7.1.
Таблица 7.1–Константы режимов файла
Константа |
Значение |
ios::in |
Открыть файл для чтения |
ios::out |
Открыть файл для записи |
ios::ate |
Переместить указатель в конец файла после открытия |
ios::app |
Добавить информацию к концу файла |
ios::trunc |
Урезать файл, если он существует |
ios::nocreate |
Не открывать новый файл (для несуществующего файла функция open() выдаст ошибку) |
ios::noreplace |
Не открывать существующий файл (для существующего выходного файла, не имеющего режимов ate или app, выдать ошибку) |
ios::binary |
Двоичный файл |
Если при связывании потока с файлом необходимо указать одновременно несколько режимов, их следует перечислять через | (операция «побитовое ИЛИ»). Например, чтобы открыть файл для добавления данных, нужно использовать следующий оператор:
ofstream fout(“myfile.dat”,ios::out|ios::app);
По умолчанию, при связывании файла с потоком ввода используется константа ios::in (открыть для чтения), а при связывании с потоком вывода – ios::out|ios::trunc (открыть файл для записи и стереть его содержимое).
14.4 Двоичные файлы
Когда данные сохраняются в файле, их можно сохранить в текстовой форме или двоичном формате. Текстовая форма означает, что все данные сохраняются как текст, даже числа. Например, сохранение значения -2.324216е+07 в текстовой форме означает сохранение 13 символов, из которых состоит данное число. Двоичный формат означает, что число сохраняется во внутреннем представлении, т.е. вместо символов сохраняется 64-разрядное представление числа типа double. Для символа двоичное представление совпадает с его текстовым – двоичным представлением ASCII-кода (или его эквивалента) символа. Однако для чисел двоичное представление очень сильно отличается от их текстового представления (рис. 5.1).
Рисунок 7.1 – Двоичное и текстовое представление числа с плавающей точкой
В двоичном формате числа сохраняются более точно, поскольку он позволяет сохранить точное внутреннее представление числа. Не происходит ошибок преобразования и округления. Сохранение данных в двоичном формате может происходить быстрее, поскольку при этом не происходит преобразования и данные можно сохранять большими блоками. Кроме того, двоичный формат обычно занимает меньше места.
Для работы с двоичными файлами используется режим ios::binary.
Чтобы сохранить данные в двоичной форме, можно воспользоваться функцией write(), которая копирует определенное число байтов из памяти в файл. Ранее указывалось, что эта функция используется для копирования текста, но она может копировать любой тип данных байт в байт, не производя преобразования. Например, если ей передать адрес переменной типа long и указать скопировать 4 байта, то данная функция скопирует 4 байта, «дословно» передав значение типа long и не производя его преобразования. Единственное неудобство заключается в том, что адрес переменной необходимо преобразовать к типу указатель-на-char. Чтобы узнать размер переменной в байтах, можно воспользоваться операцией sizeof. Пример:
long x=10L;
ofstream fout(“file1.dat”,ios::out|ios::binary);
fout.write((char*)&x,sizeof(x));
Чтобы прочесть информацию из двоичного файла, нужно использовать соответствующую функцию read() с объектом типа ifstream:
ifstream fin(“file1.dat”,ios::in|ios::binary);
fin.read((char*)&x,sizeof(x));
Данный блок кода копирует количество байтов sizeof(x) из файла в переменную x.
Подобным образом можно сохранять в файлы и читать из них и переменные более сложных типов, например, структуры (см. примеры программ).