Что такое код fopen


Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

fopen – открытие потока данных.

#include
FILE *fopen (const char *filename, const char *mode);

filename – указатель на строку содержащую имя (включая путь) открываемого файла.
mode – указатель на строку содержащую режим доступа к открытому файлу.

Указатель на управляющую таблицу открытого потока данных, если открытие файла произошло успешно.

NULL – если при открытии файла произошла ошибка. В переменную errno будет записан код ошибки.

Функция fopen открывает файл, указанный аргументом filename с режимом доступа, указанным в аргументе mode и связывает с открытым файлом поток данных.

Предусмотрены следующие режимы доступа к открытому файлу:

r или rb – открытие файла для чтения. Если файла не существует, работа программы завершиться с ошибкой.

w или wb – создать файл для записи, если файла уже существует, он будет открыт, он все имеющиеся в файле данные будут уничтожены.

a или ab – открыть файл для записи в конец файла, если файла не существует, он будет создан.

r+ или rb+ или r+b – открыть файл для чтения и записи. Если файла не существует, работа программы завершиться с ошибкой.

w+ или wb+ или w+b – создать файл для чтения и записи, если файл уже существует, он будет открыт, но все имеющиеся в файле данные будут уничтожены.

a+ или ab+ или a+b — открыть файл для записи в конец файла, если файла не существует, он будет создан.

В примере создается файл для записи с именем test.txt, располагающейся в папке myfile (папка создана до запуска программы и располагается в директории, из которой запускается программа) и в файл записывается строка «Тест записи в файл». Затем файл закрывается. Отчет о работе выводится на консоль.

Вывод на консоль:

Открытие файла: выполнено
Запись в файл выполнена
Файл закрыт

PHP | fopen () (функция открытия файла или URL)

Функция fopen () в PHP — это встроенная функция, которая используется для открытия файла или URL-адреса. Он используется для привязки ресурса к паре с использованием определенного имени файла. Имя файла и проверяемый режим отправляются в качестве параметров в функцию fopen (), и она возвращает ресурс указателя файла, если найдено совпадение, и False при ошибке. Вывод ошибки можно скрыть, добавив «@» перед именем функции.

Синтаксис:

Используемые параметры:
Функция fopen () в PHP принимает четыре параметра.

  • $ file : это обязательный параметр, который указывает файл.
  • $ mode : это обязательный параметр, который указывает тип доступа к файлу или потоку.
    Может иметь следующие возможные значения:
  • «R»: представляет только для чтения. Это начинается в начале файла.
  • «R +»: представляет чтение / запись. Он начинается в начале файла.
  • «W»: представляет только «Запись». Он открывает и очищает содержимое файла или создает новый файл, если он не существует.
  • «W +»: представляет чтение / запись. Он открывает и очищает содержимое файла или создает новый файл, если он не существует.
  • «А»: представляет только запись. Он открывается и записывает в конец файла или создает новый файл, если он не существует.
  • «+»: Представляет чтение / запись. Он сохраняет содержимое файла, записывая в конец файла.
  • «Х»: представляет только запись. Он создает новый файл и возвращает FALSE и ошибку, если файл уже существует.
  • «X +»: представляет чтение / запись. Создает новый файл, возвращает FALSE и ошибку, если файл уже существует.
  • $ include_path : это необязательный параметр, который устанавливается в 1, если вы хотите найти файл в include_path (например, php.ini).
  • $ context : это необязательный параметр, который используется для установки поведения потока.
  • Возвращаемое значение:
    Он возвращает ресурс указателя файла в случае успеха или FALSE в случае ошибки.

    Исключения:

    • При записи в текстовый файл следует использовать правильный символ конца строки в зависимости от платформы. Например, системы Unix используют / n, системы Windows используют / r / n, а системы Macintosh используют / r в качестве символа окончания строки.
    • Рекомендуется использовать флаг ‘b’ при открытии файлов с помощью fopen ().
    • Ошибка уровня E_WARNING генерируется, если открытие не удается.
    • Когда безопасный режим включен, PHP проверяет, имеет ли каталог, в котором работает сценарий, такой же UID (владельца), как и выполняемый сценарий.
    • Если вы не уверены, является ли имя файла файлом или каталогом, вам может потребоваться использовать функцию is_dir () перед вызовом fopen (), поскольку функция fopen () также может быть успешной, если filename является каталогом.

    Ниже программы иллюстрируют функцию fopen () .

    Что означает этот код? fopen (pthis — > fname, w) [закрыто]

    Ну, я спрашиваю здесь второй раз.

    Я использовал этот код.

    Поскольку я знал об этом коде, я всегда использовал fopen (» C: \ temp \ kmj12134.txt»,» w»)

    Этот код означает сохранение kmj12134.txt в C: \ temp.

    Но когда я использую этот код,

    Я не знаю, что такое имя файла и где находится место сохранения.

    Знаете ли вы имя файла и место сохранения?

    И сделайте вы знаете, как изменить имя файла и изменить место сохранения?

    1 ответ

    Если вы посмотрите справочную документацию fopen . Вы увидите, что функция определена следующим образом:

    Ваше имя файла «C:\temp\kmj12134.txt» — это путь к файлу для записи ( w ) или read ( r ) в зависимости от параметра mode .

    Итак, fp = fopen(pthis->fname,»w»); в основном означает, что вы пишете файл по пути pthis->fname , где pthis->fname имеет тип const char* . Вы можете увидеть этот путь, просто распечатав его:

    fopen — Открывает файл или URL

    (PHP 4, PHP 5, PHP 7)

    fopen — Открывает файл или URL

    Описание

    fopen() закрепляет именованный ресурс, указанный в аргументе filename , за потоком.

    Список параметров

    Если filename передан в форме «scheme://. «, он считается URL’ом и PHP проведёт поиск обработчика протокола (также известного как «обертка») для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.

    Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили безопасный режим или open_basedir, то накладываются дальнейшие ограничения.

    Если PHP установлено, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.

    Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обработчики (wrappers). Некоторые протоколы (обертки) поддерживают контекст и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется оберткой http).

    На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.

    Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:

    Список возможных режимов для fopen() используя mode
    mode Описание
    ‘r’ Открывает файл только для чтения; помещает указатель в начало файла.
    ‘r+’ Открывает файл для чтения и записи; помещает указатель в начало файла.
    ‘w’ Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пробует его создать.
    ‘w+’ Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать.
    ‘a’ Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать.
    ‘a+’ Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать.
    ‘x’ Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст ошибку уровня E_WARNING . Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2).
    ‘x+’ Создаёт и открывает для чтения и записи; иначе имеет то же поведение что и‘x’.
    ‘c’ Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от ‘w’), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотри flock() ) перед изменением, так как использование ‘w’ может обрезать файл еще до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку).
    ‘c+’ Открывает файл для чтения и записи; иначе имеет то же поведение, что и ‘c’.

    Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют \n в качестве символа конца строки, системы семейства Windows используют \r\n в качестве символов окончания строки и системы семейства Macintosh используют \r в качестве символа конца строки.

    Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «странно выглядят».

    Windows предлагает флаг режима текстовой трансляции (‘t’), который автоматически переведёт \n в \r\n во время работы с файлом. И наоборот — вы также можете использовать ‘b’, чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите ‘b’ или ‘t’ последней буквой параметра mode .

    Так как установка флага трансляции по умолчанию зависит от SAPI и используемой версии PHP, рекомендуем явно задавать указанный флаг из соображений портируемости. Вы должны использовать режим ‘t’, если вы работаете с текстовым файлом и использовать \n для обозначения конца строки в вашем скрипте, при этом не беспокоясь за читаемость ваших файлов в других приложениях типа «Блокнота». Во всех остальных случаях используйте флаг ‘b’.

    Если вы явно не укажете флаг ‘b’ во время работы с бинарными файлами, вы можете столкнуться со странной порчей ваших данных, включая испорченные файлы изображений и странные проблемы с символами \r\n.

    Из соображений портируемости, настоятельно рекомендуется всегда использовать флаг ‘b’ при открытии файлов с помощью fopen() .

    Кроме того, из соображений портируемости, также настойчиво рекомендуется переписать старый код, который полагается на режим ‘t’, чтобы вместо этого он использовал правильные концы строк и режим ‘b’.

    Необязательный третий параметр use_include_path может быть установлен в ‘1’ или TRUE , если вы также хотите провести поиск файла в include_path.

    Замечание: Поддержка контекста была добавлена в PHP 5.0.0. Для описания контекстов смотрите раздел Потоки.

    Возвращаемые значения

    Возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки.

    Ошибки

    Если открыть файл не удалось, будет сгенерирована ошибка уровня E_WARNING . Вы можете использовать оператор @ для подавления этой ошибки.

    Список изменений

    Версия Описание
    5.2.6 Добавлены опции ‘c’ и ‘c+’
    4.3.2 С версии PHP 4.3.2, по умолчанию устанавливается бинарный режим для всех платформ, различающих бинарный и текстовый режимы. Если у вас появились проблемы после обновления, попытайтесь использовать в качестве обхода проблемы флаг ‘t’, пока вы не сделаете ваш скрипт более портируемым, как это было указано выше.

    Примеры

    Пример #1 Примеры использования fopen()

    Примечания

    При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

    Замечание: Когда опция safe mode включена, PHP проверяет, имеет ли каталог, с которым вы собираетесь работать, такой же UID (владельца), как и выполняемый скрипт.

    Если вы сталкиваетесь с проблемами во время чтения или записи файлов, и вы используете PHP в виде серверного модуля, убедитесь в том, что процесс сервера имеет доступ к используемым вами файлам и директориям.

    Эта функция также может выполниться успешно, в случае если filename является директорией. Если вы не уверены является ли filename файлом или директорией, то вам необходимо воспользоваться функцией is_dir() , до вызова fopen() .

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

    • Поддерживаемые протоколы и обработчики (wrappers)
    • fclose() — Закрывает открытый дескриптор файла
    • fgets() — Читает строку из файла
    • fread() — Бинарно-безопасное чтение файла
    • fwrite() — Бинарно-безопасная запись в файл
    • fsockopen() — Открывает соединение с интернет сокетом или доменным сокетом Unix
    • file() — Читает содержимое файла и помещает его в массив
    • file_exists() — Проверяет наличие указанного файла или каталога
    • is_readable() — Определяет существование файла и доступен ли он для чтения
    • stream_set_timeout() — Устанавливает значение тайм-аута на потоке
    • popen() — Открывает файловый указатель процесса
    • stream_context_create() — Создаёт контекст потока
    • umask() — Изменяет текущую umask
    • SplFileObject

    C fopen vs open

    181 LJM [2009-11-02 00:49:00]

    Есть ли какая-либо причина (кроме синтаксических), которую вы хотите использовать

    при использовании C в среде Linux?

    c linux unix file-io fopen

    11 ответов

    206 Решение Omnifarious [2009-11-02 01:00:00]

    Во-первых, нет особой причины использовать fdopen если fopen является опцией, а open — другой возможный выбор. Вы не должны были использовать open чтобы открыть файл, если вы хотите FILE * . Поэтому включение fdopen в этот список неверно и сбивает с толку, потому что оно не очень похоже на другие. Теперь я перейду к его игнорированию, потому что важное различие здесь — между стандартным FILE * C FILE * и дескриптором файла, специфичным для ОС.

    Есть четыре основные причины использовать fopen вместо open .

    1. fopen обеспечивает буферизацию ввода-вывода, которая может оказаться намного быстрее, чем то, что вы делаете с open .
    2. fopen выполняет перевод конца строки, если файл не открывается в двоичном режиме, что может быть очень полезно, если ваша программа портирована в не-Unix среду.
    3. FILE * дает вам возможность использовать fscanf и другие функции stdio.
    4. Возможно, когда-нибудь ваш код придется перенести на другую платформу, которая поддерживает только ANSI C и не поддерживает функцию open .

    На мой взгляд, перевод конца строки чаще встречается у вас на пути, чем помогает, а синтаксический анализ fscanf настолько слаб, что вы неизбежно в конечном итоге выбрасываете его в пользу чего-то более полезного.

    И большинство платформ, поддерживающих C, имеют open функцию.

    Это оставляет вопрос буферизации. В местах, где вы в основном читаете или пишете файл последовательно, поддержка буферизации действительно полезна и значительно повышает скорость. Но это может привести к некоторым интересным проблемам, при которых данные не попадают в файл, когда вы ожидаете, что они там будут. Вы должны помнить fclose или fflush в подходящее время.

    Если вы выполняете поиск (то есть fsetpos или fseek второй из которых немного сложнее использовать в соответствии со стандартами), полезность буферизации быстро снижается.

    Конечно, мой уклон заключается в том, что я склонен много работать с сокетами, и есть тот факт, что вы действительно хотите делать неблокирующий ввод-вывод (который FILE * полностью не поддерживает каким-либо разумным способом) без какой-либо буферизации и часто сложные требования синтаксического анализа действительно окрашивают мое восприятие.

    44 Emil H [2009-11-02 00:53:00]

    open() — это низкоуровневый вызов os. fdopen() преобразует дескриптор файла os-уровня в FILE-абстракцию языка C более высокого уровня. fopen() вызывает open() в фоновом режиме и дает вам FILE-указатель напрямую.

    Существует несколько преимуществ использования файловых дескрипторов FILE-объектов, а также простота использования, а также другие технические преимущества, такие как встроенная буферизация. Особенно буферизация обычно приводит к значительному повышению производительности.

    23 Yogeesh H T [2015-11-26 15:07:00]

    fopen vs open в C

    1) fopen является библиотечной функцией, а open является системным вызовом .

    2) fopen обеспечивает буферизованный IO, который быстрее сравнивается с open , который не буферизирован.

    3) fopen переносимый, а open не переносимый (open — это специфический для среды).

    4) fopen возвращает указатель на структуру FILE (FILE *); open возвращает целое число, идентифицирующее файл.

    5) A FILE * дает вам возможность использовать fscanf и другие функции stdio.

    11 dreamlax [2009-11-02 00:53:00]

    Если у вас есть FILE * , вы можете использовать такие функции, как fscanf , fprintf и fgets и т.д. Если у вас есть только дескриптор файла, вы ограничены (но, скорее, быстрее) процедуры ввода и вывода read , write и т.д.

    10 user7116 [2009-11-02 00:58:00]

    Если вы не являетесь частью 0.1% приложений, где использование open является фактическим преимуществом производительности, действительно нет веской причины не использовать fopen . Что касается fdopen , если вы не играете с файловыми дескрипторами, вам не нужен этот вызов.

    Придерживайтесь fopen и его семейства методов ( fwrite , fread , fprintf и др.), и вы будете очень довольны. Также важно, что другие программисты будут довольны вашим кодом.

    7 digy [2010-05-05 12:31:00]

    Использование open, read, write означает, что вам приходится беспокоиться о взаимодействии с сигналами.

    Если вызов был прерван обработчиком сигнала, функции возвратят -1 и установите errno в EINTR.

    Таким образом, правильный способ закрыть файл будет

    open() — системный вызов, специфичный для Unix-систем, и он возвращает дескриптор файла. Вы можете записать в дескриптор файла, используя write() который является другим системным вызовом.
    fopen() — это вызов функции ANSI C, который возвращает указатель на файл и переносим на другие ОС. Мы можем записать указатель в файл, используя fprintf .

    В Unix:
    Вы можете получить указатель файла из дескриптора файла, используя:

    Вы можете получить дескриптор файла из указателя файла, используя:

    open() будет вызываться в конце каждой из семейных функций fopen(). open() — системный вызов, а fopen() предоставляются библиотеками в качестве функций обертки для удобства пользователя

    Зависит также от того, какие флаги необходимы для открытия. В отношении использования для записи и чтения (и переносимости) f * следует использовать, как указано выше.

    Но если в основном вы хотите указать больше стандартных флагов (например, флагов rw и append), вам придется использовать API-интерфейс платформы (например, POSIX open) или библиотеку, которая абстрагирует эти детали. В C-стандарте нет таких флагов.

    Например, вы можете открыть файл, только если он выйдет. Если вы не укажете флаг создания, файл должен существовать. Если вы добавите эксклюзив для создания, он создаст файл только в том случае, если он не существует. Есть еще много.

    Например, в системах Linux есть интерфейс интерфейса, открытый через sysfs. Он отображает яркость светодиода через файл. Запись или чтение числа в виде строки в диапазоне от 0 до 255. Конечно, вы не хотите создавать этот файл и писать только в том случае, если он существует. Теперь классная вещь: используйте fdopen для чтения/записи этого файла с помощью стандартных вызовов.

    Я изменил на open() из fopen() для моего приложения, потому что fopen вызывал двойные чтения каждый раз, когда я запускал fopen fgetc. Двойное чтение искажало то, что я пытался выполнить. open() просто делает то, что вы просите об этом.

    -1 prashad [2014-10-22 19:20:00]

    открытие файла с помощью fopen
    прежде чем мы сможем прочитать (или записать) информацию из (на) файла на диске, мы должны открыть файл. чтобы открыть файл, который мы назвали функцией fopen.

    это способ поведения функции fopen
    есть некоторые причины при буферизации, это может быть тайм-аут. поэтому при сравнении fopen (высокоуровневый i/o) с системным вызовом open (низкоуровневый i/o), и это быстрее, чем fopen.

    fopen

    Для открытия файлов в C++ существует функция fopen, обладающая множеством параметров-модификаторов, что позволяет в определенной степени менять ее функционал, подстраивая его под каждую конкретную ситуацию. Находится эта функция в библиотеке cstdio или более старой stdio.h.

    В случае успешного открытия функция возвращает ненулевую файловую переменную. Если же открытия не случилось, NULL.

    Функция обладает 2 параметрами — fname и mode, первый из которых отвечает за путь к файлу, прописываемый в виде текста, а второй за тип открытия файла. Второй параметр состоит из комбинации букв, обозначающих определенные действия.

    Наиболее частые это

    • r — означающая, что данные файла можно считывать,
    • w — означающая, что в файл можно записывать данные,
    • a — данные добавляются в конец файла,
    • b — файл распознается, как двоичный,
    • t — файл распознается как текстовый,
    • + — означающий, что файл открывается для обновления (доступны и чтение, и запись).

    Так же есть парные c и n, означающие добавление и сброс флажка фиксации, и многие другие.

    Стоит отметить, что при использование ключа w всё предыдущее содержимое файла уничтожается, также код w даёт команду создать новый файл, если файла нет.

    Рассмотрим конкретный пример, в котором в непустой файл записывается 1 строка:

    Что такое код fopen

    FILE *fopen(const char * path , const char * mode );
    FILE *fdopen(int fildes , const char * mode );
    FILE *freopen(const char * path , const char * mode , FILE * stream );

    ОПИСАНИЕ

    Параметр mode указывает на строку, начинающуюся с одной из следующих последовательностей (за ними могут следовать дополнительные символы): r Открыть текстовый файл для чтения. Чтение начинается с начала файла. r+ Открыть для чтения и записи. Чтение или запись начинаются с начала файла. w «Урезать» файл до нулевой длины или создать текстовый файл и открыть его для записи. Запись начинается с начала файла. w+ Открыть для чтения и записи. Файл создается, если до этого его не существовало, в противном случае он «урезается». Чтение или запись начинаются с начала файла. a Открыть для дописывания (записи в конец файла). Файл создается, если до этого его не существовало. Запись осуществляется в конец файла. a+ Открыть для чтения и дописывания (записи в конец файла). Файл создается, если до этого его не существовало. Чтение или запись производятся с конца файла.

    Строка mode может также включать в себя символ «b» в качестве последнего символа или символа, входящего в любые описанные выше двухсимвольные комбинации. Это требование является строгим только в случае, если требуется совместимость этой версии с ANSI X3.159-1989 («ANSI C»); символ «b» игнорируется во всех POSIX-совместимых системах, включая Linux. Другие системы могут иначе обращаться к текстовым и бинарным файлам, и добавление «b» может оказаться полезным, если Вы осуществляете ввод-вывод в двоичный файл; возможно, Ваша программа будет когда-нибудь работать с не-Unix окружением.

    Любой созданный файл будет иметь атрибуты S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666), как модифицированный величиной umask процесса (см. umask (2) ).

    Чтение и запись могут накладываться друг на друга в потоке, открытом для чтения/записи, в любом порядке. Заметим, что ANSI C требует, чтобы между чтением/записью использовались функции позиционирования в файле, пока операция ввода не встретит конец файла. Если это условие не выполняется, то при чтении разрешается возвращать результат, не совпадающий с самым последним изменением. То есть будет хорошим тоном (а иногда и действительно необходимым в Linux) использовать функции fseek или fgetpos между операциями чтения и записи в одном потоке. Эти операции могут фактически быть «пустыми» (как, например, fseek(. 0L,SEEK_CUR) , вызванная для того, чтобы возник ее побочный эффект синхронизации).

    Открытие файла в режиме дописывания ( a в качестве первого символа mode ) приводит к тому, что все последующие операции записи в этот поток производятся в конец файла, как если бы перед ними была вызвана функция fseek(stream,0,SEEK_END);

    Функция fdopen связывает поток с существующим описателем файла fildes . Режим mode потока (одно из следующих значений: «r», «r+», «w», «w+», «a», «a+») должен быть совместим с режимом описателя файла. Указатель файловой позиции в новом потоке принимает значение, равное значению fildes , а указатели ошибок и конца файла по значению равны нулю. Режимы «w» или «w+» не «урезают» файл. Описатель файла не скопирован и будет закрыт, когда поток, созданный fdopen , закрывается. Результат применения fdopen в общем объекте памяти неопределен.

    Функция freopen открывает файл с именем path и связывает его с потоком stream . Исходный поток (если такой существовал) закрывается. Параметр mode используется, как и в функции fopen . Основной задачей функции freopen является изменение файла, связанного со стандартным текстовым потоком ( stderr , stdin , or stdout ).

    ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ


    НАЙДЕННЫЕ ОШИБКИ

    Функции fopen , fdopen и freopen при ошибках устанавливают значение errno равным какому-либо значению из определенных в malloc (3).

    Функция fopen при ошибках устанавливает значение errno равным какому-либо значению из определенных в open (2).

    Функция fdopen при ошибках устанавливает значение errno равным какому-либо значению из определенных в fcntl (2).

    Функция freopen при ошибках устанавливает errno равным какому-либо значению из определенных в open (2), fclose (3) и fflush (3).

    Что такое код fopen

    Возможно он уже открыт какой-то другой программой или процессом, например на просмотр.

    Re: FOPEN()
    ry

    Сообщений: 2031

    Дата: 13.03.09 15:05:12

    Например, не был закрыт по FCLOSE() или CLOSE ALL после первого запуска программы.

    Как fopen_s может быть более безопасным, чем fopen?

    Я работаю над устаревшим кодом для Windows Платформа. Когда я компилирую код в VS2013 Дайте следующее предупреждение:

    ошибка C4996: ‘ fopen ‘: Эта функция или переменная может быть небезопасной. Рассмотреть возможность использования fopen_s вместо. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS. Смотрите справку для деталей.»

    И это также даст знакомое предупреждение для sprintf , я понимаю sprintf_s более безопасен, чем sprintf из-за переполнения буфера.

    Но как можно fopen_s быть более безопасным, чем fopen , нет никаких шансов переполнения буфера, потому что fopen не принимает буфер Может ли кто-нибудь представить случай fopen небезопасно, и fopen_s безопасно?

    Решение

    s в данном случае не означает «безопасный», он означает «повышенная безопасность». За fopen_s параметры проверяются на достоверность перед попыткой открыть файл.

    С fopen , вы можете передать NULL указатель на имя файла, и все, скорее всего, распадется на части. fopen_s не имеет этой проблемы (А) .

    Имейте в виду, что эти границы проверки интерфейсов, таких как fopen_s являются необязательный часть стандарта ИСО, подробно изложенная в Приложении K (во всяком случае, на C11). Реализации не требуется обеспечить их и, если честно, fopen и многие другие так называемые небезопасные функции совершенно безопасны, если вы знаете, что делаете как кодировщик.

    Интересно отметить, что fopen_s будет ловить указатели NULL для вас, но не для недействительных указателей, поэтому его безопасность повышена, а не безопасна — вы все равно можете нанести некоторый ущерб, если передадите недействительный, но ненулевой указатель.

    Другие «безопасные» функции, которые вынуждают вас предоставлять размер буфера назначения, также безопасны, только если вы передаете правильный размер. Передайте что-то слишком большое, и все ставки сняты.

    (А) От C11 K.3.5.2.1 The fopen_s function :

    Время воспроизведения-ограничение

    Ни один из streamptr, filename или mode не должен быть нулевым указателем.

    Если есть нарушение ограничения времени выполнения, fopen_s не пытается открыть файл. Кроме того, если streamptr не является нулевым указателем, fopen_s устанавливает * streamptr в нулевой указатель.

    Сравните это с C11 7.20.5.3 The fopen function в котором говорится, что имя файла и режим должны указывать на строку, но не указывают, что произойдет, если вы укажете NULL-указатель (большинство реализаций, скорее всего, завершится с ошибкой разыменования нулевого указателя).

    Что такое код fopen

    Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

    fdopen(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

    ОПИСАНИЕ

    Параметр mode указывает на строку, начинающуюся с одной из следующих последовательностей (за ними могут следовать дополнительные символы, описанные далее):

    r Открыть текстовый файл для чтения. Поток совмещается с началом файла. r+ Открыть для чтения и записи. Поток совмещается с началом файла. w Обрезать файл до нулевой длины или создать текстовый файл для записи. Поток совмещается с началом файла. w+ Открыть для чтения и записи. Файл создаётся, если его не существует, в противном случае он обрезается. Поток совмещается с началом файла. a Открыть для добавления (записи в конец файла). Файл создаётся, если его не существует. Поток совмещается с концом файла. a+ Открыть для чтения и добавления (записи в конец файла). Файл создаётся, если не существует. Начальное положение в файле для чтения устанавливается в начало файла, но вывод всегда добавляется в конец файла.

    Строка mode может также содержать символ «b» в качестве последнего символа или символа между двумя символами в любых описанных выше двухсимвольных комбинациях. Это требуется только для совместимости с C89 и не оказывает никакого влияния; символ «b» игнорируется во всех POSIX-совместимых системах, включая Linux. Другие системы могут по-разному обращаться с текстовыми и двоичными файлами, и добавление «b» может оказаться полезным, если вы осуществляете ввод-вывод в двоичный файл и ожидаете, что ваша программа может быть перенесена в не UNIX окружение.

    О имеющихся расширениях mode в glibc смотрите ЗАМЕЧАНИЯ далее.

    Любой созданный файл будет иметь атрибуты S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666), как изменённые в соответствии со значением umask процесса (смотрите umask(2)).

    Чтение и запись могут перемешиваться друг с другом в потоке, открытом для чтения/записи, в любом порядке). Заметим, что в ANSI C требуется, чтобы между выводом и вводом использовались функции позиционирования в файле, если операция ввода не встретила конец файла. Если это условие не выполняется, то при чтении разрешается возвращать результат, не совпадающий с данными самой последней записи. Поэтому рекомендуется (а иногда и действительно необходимо в Linux) использовать функции fseek(3) или fgetpos(3) между операциями чтения и записи в одном потоке. Эти операции могут фактически быть пустыми (например, fseek(. 0L, SEEK_CUR), вызванная для того, чтобы возник её побочный эффект синхронизации).

    Открытие файла в режиме дописывания (a в качестве первого символа mode) приводит к тому, что все последующие операции записи в этот поток производятся в конец файла, как если бы перед ними была вызвана:

    Функция fdopen() связывает поток с существующим дескриптором файла fd. Режим mode потока (одно из следующих значений: «r», «r+», «w», ,w+», «a», «a+») должен быть совместим с режимом дескриптора файла. Указатель положения в файле в новом потоке принимает значение, равное значению у fd, а указатели ошибок и конца файла очищаются. Режимы «w» или «w+» не обрезают файл. При этом не делается копия дескриптора файла и он будет закрыт одновременно с закрытием потока, созданного fdopen(). Результат применения fdopen() к общему объекту памяти не определён.

    Функция freopen() открывает файл с именем path и связывает его с потоком stream. Исходный поток (если такой существовал) закрывается. Значение параметра mode такое же как у функции fopen(). Основной задачей функции freopen() является смена файла, связанного со стандартным текстовым потоком (stderr, stdin или stdout).

    ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

    ОШИБКИ

    Функции fopen(), fdopen() и freopen() могут также завершаться с ошибками и устанавливают значение errno равным какому-либо значению из определённых в malloc(3).

    Функция fopen() при ошибках устанавливает значение errno равным какому-либо значению из определённых в open(2).

    Функция fdopen() при ошибках устанавливает значение errno равным какому-либо значению из определённых в fcntl(2).

    Функция freopen() при ошибках устанавливает errno равным какому-либо значению из определённых в open(2), fclose(3) и fflush(3).

    АТРИБУТЫ

    Описание терминов данного раздела смотрите в attributes(7).

    Интерфейс Атрибут Значение
    fopen(), fdopen(), freopen() безвредность в нитях безвредно (MT-Safe)

    СООТВЕТСТВИЕ СТАНДАРТАМ

    fdopen(): POSIX.1-2001, POSIX.1-2008.

    ЗАМЕЧАНИЯ

    Замечания по glibc

    В дополнении к этим символам, для fopen() и freopen() поддерживается следующий синтаксис в mode:

    Передаваемая строка используется как имя набора символов и поток помечается как широкосимвольный. С того момента внутренние функции преобразования перекодируют данные ввода-вывода в соответствии с набором символов с именем строка. Если синтаксис ,ccs=строка не указан, то широкосимвольность потока определяется по первой файловой операции. Если это операция является широкосимвольной, то поток помечается как широкосимвольный и загружаются функции для перекодировки.

    Илон Маск рекомендует:  Картинка с тенью
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL