fopen, fopen_s
С сайта ru.cppreference.net
| Определены в заголовочном файле <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) Открывает файл, указанный с помощью
filename, и возвращает указатель на поток файла, связанный с этим файлом. mode используется для определения режима доступа к файлу.2) То же, что и (1), за исключением того, что указатель на поток файла записывается в
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
| |