- •1.1.Указатели
- •1.1.1.Объявление указателей и работа с адресами
- •1.1.2.Адресная арифметика
- •1.1.3.Указатели как формальные параметры функции
- •1.1.4.Связь указателей и массивов
- •1.1.5.Константные указатели и указатели на константы
- •1.1.6.Связь указателей и строк
- •1.1.7.Преобразование указателей
- •1.1.8.Бестиповые указатели
- •1.1.9.Массив указателей
- •1.1.10.Указатели на указатели
- •1.1.11.Резервирование и освобождение памяти (операторы new и delete)
- •1.2.Типы данных, определяемые пользователем
- •1.2.1.Переопределяемые типы данных
- •1.2.2.Структуры
- •1.2.2.1.Массивы структур
- •1.2.2.2.Использование указателей на структуры
- •1.2.2.4.Динамические структуры и массивы структур
- •1.2.3.Классы
- •1.2.3.1.Введение в ооп
- •2.1.Потоки
- •2.2.Стандартные потоки
- •2.4.Файловые потоки
- •2.4.1.Общие принципы работы с файлами
- •2.4.2.Режимы открытия файлов
- •2.4.3.Текстовые и бинарные файлы и файловые потоки
- •2.4.4.Проверка состояния файла и потока
- •2.4.5.Функции (методы) ввода-вывода
- •2.4.5.1.Методы get и put
- •2.4.5.2.Метод getline
- •2.4.5.3.Методы read и write
- •2.4.6.Особенности работы с бинарными файлами
- •2.4.7.Использование текущей позиции файла
2.4.3.Текстовые и бинарные файлы и файловые потоки
Различают текстовые и бинарные (двоичные) файлы и, соответственно, текстовые и бинарные файловые потоки.
Предполагается, что текстовые файлы состоят из символов и могут разделяться на строки. Любой символ в файле представляется соответствующим ему числовым кодом. Признаком перехода на следующую строку является символ '\n' с числовым кодом 10, именно это значение (10) вводится в стандартный входной поток при нажатии клавиши Enter клавиатуры. Этот символ при физической записи файла на диск во многих операционных системах (в частности, Windows) обычно заменяется парой символов с кодами 13 и 10 (шестнадцатеричные значения – 0D, 0A (“возврат каретки” и “прогон бумаги”)). При вводе в поток происходит обратное преобразование. Указанная замена может быть обнаружена при просмотре текстового файла какой-нибудь из программ, обеспечивающих побайтовый просмотр кода. Это преобразование сказывается на физической длине файла. Так, длина файла из трех 20-символьных строк будет 64 или 66 байтов, в зависимости от того, ставился ли явно признак перехода на следующую строку в конце последней строки. Именно текстовые файлы создаются и просматриваются простыми текстовыми редакторами.
Числа хранятся в текстовых файлах в виде соответствующих последовательностей символов.
Бинарные файлы содержат данные, представленные во внутреннем формате: символьные данные – в символьном, числовые – в числовом. Такие файлы позволяют компактно хранить и быстрее обрабатывать числовую информацию. При работе с ними не требуется преобразовывать числа из символьного вида при вводе и в символьный вид при выводе.
Бинарные файлы не предназначены для просмотра текстовыми редакторами, для них не предусмотрено разделение на строки. Символ '\n' записывается в бинарный файл как обычное однобайтовое значение 10 (шестнадцатеричное 0A). Длина бинарного файла совпадает с числом байтов, выведенных в поток при формировании данного файла, хотя в некоторых реализациях в бинарных файлах могут содержаться дополнительные нулевые значения для выравнивания записей, например, на границу сектора на диске. Очень часто бинарные файлы содержат данные одного и того же типа, например, только числа определенной длины или структуры определенного формата, что позволяет легко перемещаться к требуемым элементам данных.
Следует отметить, что открытие файла с указанием флага ios::binary определяет только действия, связанные с трактовкой значения 10 при работе с файлом, способ же хранения информации в файле определяется теми методами, которые применяются при формировании этого файла. “Распознать” тип существующего файла по расширению его имени нельзя, поскольку оно определяется программистом при создании файла и в общем случае может быть любым. Так, ничто не запрещает присвоить расширение .txt бинарному файлу, хотя желательно при именовании файла подчеркивать расширением его содержание.
2.4.4.Проверка состояния файла и потока
Открытие файла и связанного с ним потока может оказаться не успешным, например, из-за отсутствия указанного файла или невозможности его создания. Существует несколько методов, позволяющих проверить состояние файла и потока.
Успешность выполнения открытия потока можно проверить с помощью метода is_open, определенного в классах ifstream, ofstream, fstream. Его прототип:
bool is_open (); // true – поток связан с открытым файлом, false - нет
Проверка правильности открытия файла для входного файлового потока f1:
if (!f1.is_open())
cout << "Input file can't be opened.\n";
При неуспешном открытии файла связанному с ним потоку присваивается нулевое значение, поэтому эта же проверка может быть записана и так:
if (!f1)
cout << "Input file can't be opened.\n";
Определить, достигнут ли конец входного файла, можно при помощи метода eof, являющегося методом класса ios, а, следовательно, и методом класса ifstream. Его прототип:
bool eof(); // true – конец файла достигнут, false - нет
При использовании этого метода следует иметь в виду, что он возвращает значение true, только в случае, если к моменту его вызова конец файла был реально обнаружен. Например, когда при чтении разделенных пробелами чисел из текстового файла конец файла для последнего числа "выступил" в роли ограничителя. Если же, скажем, после последнего числа в текстовом файле содержится еще один символ-разделитель, именно он явится ограничителем и метод eof начнет возвращать значение true только после следующего чтения файла.
