fopen, fopen_s
Определено в заголовочном файле <stdio.h> | ||
|---|---|---|
FILE* fopen( const char* filename, const char* mode ); | (1) | (до C99) |
FILE* fopen( const char* restrict filename, const char* restrict mode ); | (начиная с C99) | |
errno_t fopen_s( FILE* restrict* restrict streamptr,
const char* restrict filename,
const char* restrict mode );
| (2) | (начиная с C11) |
1) Открывает файл, указанный в
2) То же, что и (1), за исключением того, что указатель на поток файла записывается в filename, и возвращает указатель на поток файла, связанный с этим файлом. Для определения режима доступа к файлу используется mode.streamptr, а во время выполнения обнаруживаются следующие ошибки, вызывающие вызов установленной в данный момент функции обработчика ограничений: -
streamptrявляется нулевым указателем -
filenameявляется нулевым указателем -
modeявляется нулевым указателем
fopen_s гарантированно доступна только в том случае, если реализация определяет __STDC_LIB_EXT1__, а пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <stdio.h>. Параметры
| filename | - | имя файла, с которым следует связать поток файла |
| mode | - | завершающаяся нулем символьная строка, определяющая режим доступа к файлу |
| streamptr | - | указатель на указатель, куда функция записывает результат (выходной параметр) |
Флаги доступа к файлу
| Строка режима доступа к файлу | Назначение | Описание | Действие, если файл уже существует | Действие, если файл не существует |
|---|---|---|---|---|
"r" | чтение | Открыть файл для чтения | чтение с начала | ошибка открытия |
"w" | запись | Создать файл для записи | удалить содержимое | создать новый |
"a" | добавление | Добавить данные в файл | запись в конец | создать новый |
"r+" | чтение с обновлением | Открыть файл для чтения и записи | чтение с начала | ошибка |
"w+" | запись с обновлением | Создать файл для чтения и записи | удалить содержимое | создать новый |
"a+" | добавление с обновлением | Открыть файл для чтения и записи | запись в конец | создать новый |
Для открытия файла в двоичном режиме можно дополнительно указать флаг режима доступа к файлу "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 требует 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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.5.3 Функция fopen (стр. TBD)
- K.3.5.2.1 Функция fopen_s (стр. TBD)
- Стандарт 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++ для fopen |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/fopen