Spec-Zone.ru › C

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) Открывает файл, указанный в 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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/io/fopen

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API