Namespaces
Variants

fopen, fopen_s

С сайта ru.cppreference.net
< c | io
 
 
Файловый ввод/вывод
Типы и объекты
        
Функции
Доступ к файлам
(C95)
Неформатированный ввод/вывод
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Форматированный ввод
Прямой ввод/вывод
Форматированный вывод
Позиционирование в файле
Обработка ошибок
Операции с файлами
 
Определены в заголовочном файле <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

См. также

закрывает файл
(функция)
синхронизирует выходной поток с фактическим файлом
(функция)
открывает существующий поток с другим именем
(функция)