fopen, fopen_s
Определено в заголовочном файле <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,
const char *restrict mode );
| (2) | (начиная с C11) |
1) Открывает файл, указанный в
filename, и возвращает указатель на поток файла, связанный с этим файлом. mode используется для определения режима доступа к файлу.
2) То же, что и (1), за исключением того, что указатель на поток файла записывается в
streamptr, а следующие ошибки обнаруживаются во время выполнения и вызывают текущую функцию обработчика ограничений: -
streamptrявляется указателем null -
filenameявляется указателем null -
modeявляется указателем null
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 требует, чтобы 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++ для fopen |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/fopen