Открытие файла

Типы файлов.

В файле может храниться любая информация. Если там хранится текст в виде последовательности символов (включая символы перевода строк, хранимые по определенным правилам - см. ниже) и не содержится иной информации, такой файл называют текстовым. Язык Си имеет ряд встроенных средств для работы с текстовыми файлами. Все прочие файлы в языке Си называют нетекстовыми или бинарными. Входящая в состав Windows cтандартная программа "Блокнот" нормально отображает только текстовые файлы, поэтому является удобным способом проверить, является ли содержимое файла текстовым.

Примеры текстовых файлов (знак * означает любое имя файла):

Текст (*.txt)

Текст программы на языке Си (называемый ее исходным кодом) (*.cpp)

Примеры бинарных файлов:

Документ Word (*.doc) - является бинарным, т.к., кроме последовательности символов, содержит иную информацию (например, о шрифте)

Исполняемый файл программы на языке Си (называемый ее исполняемым кодом) (*.exe)

Изображения (*.bmp и др.)

Подчеркнем, что " тип файла ", указываемый после точки в имени файла, является всего лишь " расширением имени " - он указывает операционной системе, какие действия ей следует выполнять с этим файлом. На само содержимое файла он не влияет; однако, если это содержимое не соответствует расширению файла, система может попытаться предпринять с ним неверные действия. Поэтому, если программа создает файл, которым в дальнейшем будет пользоваться только она, можно выбрать для него любое расширение, не совпадающее ни с каким стандартным (желательно, не длиннее 3-4 символов).

Каждому файлу, с которым работает программа, присваивается внутреннее логическое имя, используемое в дальнейшем при обращении к нему. Логическое имя (идентификатор файла) - это указатель на файл, т.е. на область памяти, где содержится вся необходимая информация о файле. Формат объявления указателя на файл следующий:

FILE *указатель на файл;

FILE - идентификатор структурного типа, описанный в стандартной библиотеке stdio.h и содержащий следующую информацию (она приводится здесь для справки):

type struct {

short level; - число оставшихся в буфере непрочитанных байт; обычный размер буфера - 512 байт; как только level=0, в буфер из файла читается следующий блок данных;
unsigned flags; - флаг статуса файла - чтение, запись, дополнение;
char fd; - дескриптор файла, т.е. число, определяющее его номер;
unsigned char hold; - непереданный символ, т.е. ungetc-символ;
short bsize; - размер внутреннего промежуточного буфера;
unsigned char buffer; - значение указателя для доступа внутри буфера, т.е. задает начало буфера, начало строки или текущее значение указателя внутри буфера в зависимости от режима буферизации;
unsigned char *curp; - текущее значение указателя для доступа внутри буфера, т.е. задает текущую позицию в буфере для обмена с программой;
unsigned istemp; - флаг временного файла;
short token; - флаг при работе с файлом;

} FILE;

Прежде, чем начать работать с файлом, т.е. получить возможность чтения или записи информации в файл, его нужно открыть. Для этого обычно используется функция

FILE* fopen (char * имя_файла, char *режим);

она берет внешнее представление - физическое имя файла на носителе (дискета, винчестер) и ставит ему в соответствие логическое имя.

Физическое имя, т.е. имя файла и путь к нему, задается первым параметром - строкой, например, “Mas_dat.dat” - файл с именем Mas_dat.dat, находящийся в текущей папке, “d:\\work\\Sved.txt” - файл с именем Sved.txt, находящийся на винчестере, в каталоге work.

Внимание, обратный слеш (\), как специальный символ, в строке записывается дважды!

Второй параметр - строка, в которой задается режим доступа к файлу:

w - файл открывается для записи; если файла с заданным именем нет, то он будет создан; если такой файл существует, то перед открытием прежняя информация уничтожается;

r - файл открывается только для чтения; если такого файла нет, то возникает ошибка;

a - файл открывается для добавления в его конец новой информации; если файла с заданным именем нет, то он будет создан;

r+, w+, a+ - файл вначале открывается по правилам режимов r, w, a соответственно, но в дальнейшем разрешается любая работа с файлом (как чтение, так и запись). Например, r+ означает, что файл открывается для редактирования данных - возможны и запись, и чтение информации. Для записи же в файл, открытый как r, пришлось бы его закрыть и открыть с другим режимом.

В конце строки, задающей режим доступа, могут дополнительно указываться буквы t или b:

t - файл открывается в текстовом режиме;

b - файл открывается в двоичном режиме.

По умолчанию при обычных настройках файл открывается в текстовом режиме.

Текстовый режим отличается от двоичного только тем, что в нем символ «перевод строки» '\n' (его код 10) при любой записи в файл автоматически заменяется на пару символов: «возврат каретки» '\r' (его код 13) и «перевод строки» '\n'; а при любом чтении из файла выполняется обратное преобразование: пара символов «перевод строки», «возврат каретки» заменяется на один символ: «перевод строки». Дело в том, что в текстовых файлах (см. выше) разделителем строк является именно пара символов "\r\n" (по историческим причинам), в то время как при выводе на консоль строка завершается одним символом '\n'. Автоматическое преобразование позволяет программировать чтение/запись в файл так же, как ввод/вывод на консоль. Поэтому для текстовых файлов удобен текстовый режим, а для остальных - бинарный. Если при записи был использован один режим, а при чтении - другой, количество прочтенных байт может отличаться от количества записанных.

Достаточно очевидно, что при открытии файла с режимом r указатель позиции ставится в начало файла, а с режимом a - в конец.

При успешном открытии функция fopen() возвращает указатель на файл (в дальнейшем - указатель файла). При ошибке возвращается значение NULL,а работа программы не прерывается. Данная ситуация обычно возникает, когда неверно указывается путь к открываемому файлу - например, если в дисплейном классе нашего университета указать путь, запрещенный для записи (обычно, разрешенным является d:\work\). Она возникает также, если режим доступа не соответствует правам доступа, установленным системным администратором - например, при попытке открыть с режимом r+ файл, разрешенный только для чтения.

Пример:

FILE *f; - объявляется указатель на файл f;

f = fopen ("d:\\work\\Dat_sp.cpp", "w"); - открывается для записи файл с логическим именем f, имеющим физическое имя Dat_sp.cpp, находящийся на диске d, в каталоге work.

Это можно переписать более кратко:

FILE *f = fopen ("d:\\work\\Dat_sp.cpp", "w");

Тот факт, что при неудаче fopen() программа не прерывается, удобен для программного анализа причин сбоя. Но он может "маскировать" ошибку; программист думает, что файл содержит неверную информацию, или программа неверно читает данные, хотя на самом деле файл не был открыт. Поэтому рекомендуется после вызова fopen() проверять указатель файла на неравенство NULL.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: