Spec-Zone.ru › C

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

См. также

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

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

Spec-Zone.ru

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