Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электронный конспект лекций (семестр 2).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
251.39 Кб
Скачать

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 только после следующего чтения файла.