fopen, fopen_s
From cppreference.net
|
Определено в заголовочном файле
<stdio.h>
|
||
| (1) | ||
|
FILE
*
fopen
(
const
char
*
filename,
const
char
*
mode
)
;
|
(до C99) | |
|
FILE
*
fopen
(
const
char
*
restrict
filename,
const
char
*
restrict
mode
)
;
|
(начиная с C99) | |
|
errno_t fopen_s
(
FILE
*
restrict
*
restrict
streamptr,
const
char
*
restrict
filename,
|
(2) | (начиная с C11) |
1)
Открывает файл, указанный в
filename
и возвращает указатель на файловый поток, связанный с этим файлом.
mode
используется для определения режима доступа к файлу.
2)
То же, что и
(1)
, за исключением того, что указатель на файловый поток записывается в
streamptr
и следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную
функцию обработки ограничений
:
-
-
streamptrявляется нулевым указателем -
filenameявляется нулевым указателем -
modeявляется нулевым указателем
-
fopen_s
гарантированно доступна только если
__STDC_LIB_EXT1__
определено реализацией и если пользователь определяет
__STDC_WANT_LIB_EXT1__
как целочисленную константу
1
перед включением
<stdio.h>
.
Содержание |
Параметры
| filename | - | имя файла для ассоциации с файловым потоком |
| mode | - | строка символов с нулевым завершителем, определяющая режим доступа к файлу |
| streamptr | - | указатель на указатель, куда функция сохраняет результат (выходной параметр) |
Флаги доступа к файлам
|
Режим доступа к файлу
(строка) |
Значение | Объяснение |
Действие, если файл
уже существует |
Действие, если файл
не существует |
|---|---|---|---|---|
| "r" | read | Открыть файл для чтения | чтение с начала | ошибка открытия |
| "w" | write | Создать файл для записи | уничтожить содержимое | создать новый |
| "a" | append | Добавление в файл | запись в конец | создать новый |
| "r+" | read extended | Открыть файл для чтения/записи | чтение с начала | ошибка |
| "w+" | write extended | Создать файл для чтения/записи | уничтожить содержимое | создать новый |
| "a+" | append extended | Открыть файл для чтения/записи | запись в конец | создать новый |
|
Флаг режима доступа к файлу
"b"
может быть дополнительно указан для открытия файла в бинарном режиме. Этот флаг не влияет на POSIX-системы, но в Windows отключает специальную обработку
'
\n
'
и
'
\x1A
'
.
В режимах доступа с добавлением данные записываются в конец файла независимо от текущей позиции указателя файла. |
||||
| Поведение не определено, если режим не является одной из перечисленных выше строк. Некоторые реализации определяют дополнительные поддерживаемые режимы (например, Windows ). | ||||
| В режиме обновления ( '+' ) могут выполняться как ввод, так и вывод, но вывод не может следовать за вводом без промежуточного вызова fflush , fseek , fsetpos или rewind , а ввод не может следовать за выводом без промежуточного вызова fseek , fsetpos или rewind , если операция ввода не достигла конца файла. В режиме обновления реализациям разрешено использовать бинарный режим даже когда указан текстовый режим. | ||||
| Флаг режима доступа к файлу "x" может быть дополнительно добавлен к спецификаторам "w" или "w+" . Этот флаг заставляет функцию завершиться ошибкой, если файл существует, вместо его перезаписи. (C11) | ||||
| При использовании fopen_s или freopen_s , права доступа к файлу для любого файла, созданного с "w" или "a" , запрещают доступ другим пользователям. Флаг режима доступа к файлу "u" может быть дополнительно добавлен перед любым спецификатором, начинающимся с "w" или "a" , чтобы включить права доступа по умолчанию для fopen . (C11) | ||||
Возвращаемое значение
1)
В случае успеха возвращает указатель на новый файловый поток. Поток полностью буферизован, если только
filename
не ссылается на интерактивное устройство. При ошибке возвращает нулевой указатель.
POSIX требует
, чтобы в этом случае был установлен
errno
.
2)
При успешном выполнении возвращает ноль, и указатель на новый файловый поток записывается в
*
streamptr
. При ошибке возвращает ненулевой код ошибки и записывает нулевой указатель в
*
streamptr
(если только
streamptr
сам не является нулевым указателем).
Примечания
Формат
filename
определяется реализацией и не обязательно ссылается на файл (например, это может быть консоль или другое устройство, доступное через API файловой системы). На платформах, которые их поддерживают,
filename
может включать абсолютный или относительный путь файловой системы.
Пример
Запустить этот код
#include <stdio.h> #include <stdlib.h> int main(void) { const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL); int is_ok = EXIT_FAILURE; FILE* fp = fopen(fname, "w+"); if (!fp) { perror("File opening failed"); return is_ok; } fputs("Hello, world!\n", fp); rewind(fp); int c; // note: int, not char, required to handle EOF while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop putchar(c); if (ferror(fp)) puts("I/O error when reading"); else if (feof(fp)) { puts("End of file is reached successfully"); is_ok = EXIT_SUCCESS; } fclose(fp); remove(fname); return is_ok; }
Возможный вывод:
Hello, world! End of file is reached successfully
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.21.5.3 Функция fopen (стр: 223-224)
-
- K.3.5.2.1 Функция fopen_s (стр: 428-429)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.21.5.3 Функция fopen (стр: 305-306)
-
- K.3.5.2.1 Функция fopen_s (стр: 588-590)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.19.5.3 Функция fopen (стр: 271-272)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.9.5.3 Функция fopen
Смотрите также
|
закрывает файл
(функция) |
|
|
синхронизирует выходной поток с фактическим файлом
(функция) |
|
|
(C11)
|
открывает существующий поток с другим именем
(функция) |
|
C++ documentation
для
fopen
|
|