Программирование на C и C++

Онлайн справочник программиста на C и C++

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

Функция fopen() открывает для использования поток, связывает файл с данным потоком и затем возвращает указатель FILE на данный поток. Чаще всего файл рас­сматривается как дисковый файл. Функция fopen() имеет следующий прототип:

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

где режим указывает на строку, содержащую желаемый режим открытия файла. Допустимые зна­чения для режим в Borland С++ показаны в таблице. имя_файла должно быть строкой симво­лов, предоставляющей корректное имя файла операционной системе, и может содержать указа­ние пути.

Функция fopen() возвращает указатель базового типа FILE. Данный указатель идентифицирует файл и используется большинством функций файловой системы. Его никогда не следует изменять самостоятельно. Функция возвращает нулевой указатель, если файл не может быть открыт.

Как показывает таблица, файл может быть открыт или в текстовом, или в двоичном режи­ме. В текстовом режиме при вводе последовательность возврат каретки и перевод строки трансли­руется в символ новой строки. При выводе справедливо обратное: символ новой строки трансли­руется в возврат каретки и перевод строки. В двоичных файлах такого перевода не происходит. Когда в аргументе режима не указаны ни t, ни b, то статус файла текстовый/двоичный определя­ется значением глобальной переменной _fmode, определенной в Borland С++. По умолчанию fmode установлена в О_ТЕХТ, то есть устанавливается текстовый режим. Если установить _fmode в О_BINARY, то файлы будут открываться в двоичном режиме. (Эти макросы определены в fcntl.h.) Естественно, использование явно указанных t или b устраняет эффекты, связанные с переменной _fmode. Кроме этого, _fmode характерна только для продуктов Borland. Она не определена в системе ввода/вывода ANSI С.

Если необходимо открыть файл с именем test на запись, то следует написать:

fp = fopen ("test", "w") ;

где fp - это переменная типа FILE *. Тем не менее обычно можно увидеть следующее:

if((fp = fopen("test", "w"))==NULL) {
puts ("Cannot open file.");
exit (1);
}

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

Если fopen() используется для открытия файла на запись, то любой ранее существующий файл с указанным именем будет удален. Если файла с указанным именем не существует, то он будет создан.

Если необходимо дописать информацию в конец файла, следует использовать режим а (добавления). Если файл не существует, то он будет создан.

Открытие файла на чтение требует наличия файла. Если файл не существует, то будет возвращена ошибка. Если файл открыт для операции чтения/записи, то он не удаляется при наличии, а если файл не существует, то он создается.

Таблица: Допустимые значения режимов

Режим

Значение

"r"

Открывает файл для чтения. (Открывает по умолчанию как текстовый файл.)

"w"

Создает файл для записи. (Открывает по умолчанию как текстовый файл.)

"а"

Присоединяет к файлу. (Открывает по умолчанию как текстовый файл.)

"rb"

Открывает двоичный файл для чтения.

"wb"

Открывает двоичный файл для записи.

"ab"

Присоединяет к двоичному файлу.

"r+"

Открывает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)

"w+"

Создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)

"a+"

Присоединяет или создает файл для чтения/записи. (Открывает по умолчанию как текстовый файл.)

"r+b"

Открывает двоичный файл для чтения/записи.

"w+b"

Создает двоичный файл для чтения/записи.

"a+b"

Присоединяет или создает двоичный файл для чтения/записи.

"rt"

Открывает текстовый файл для чтения.

"wt"

Создает текстовый файл для записи.

"at"

Присоединяет к текстовому файлу.

"r+t"

Открывает текстовый файл для чтения.

"w+t"

Создает текстовый файл для чтения/записи.

"a+t"

Открывает или создает текстовый файл для чтения/записи.