Namespaces
Variants

fopen, fopen_s

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <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 является нулевым указателем
  • 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

Смотрите также

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