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


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

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 (папка создана до запуска программы и располагается в директории, из которой запускается программа) и в файл записывается строка «Тест записи в файл». Затем файл закрывается. Отчет о работе выводится на консоль.

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

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

fopen

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

Описание

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

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

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

Note: Список поддерживаемых протоколов доступен в разделе List of Supported Protocols/Wrappers. Некоторые протоколы ( обвёртки) поддерживают context и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется обвёрткой http). Для получения описания параметров contexts и zcontext , обратитесь к разделу Streams.

Note: Поддержка контекста была добавлена в PHP 5.0.0.

Note: Начиная с версии PHP 4.3.2, бинарный режим является режимом по умолчанию для всех платформ, которые различают бинарный и текстовый, режимы. Если у вас возникли проблемы после обновления, попробуйте использовать флаг ‘t’ в качестве обходного пути до тех пор, пока вы не измените свои скрипты для достижения большей портируемости, как отмечено выше.

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

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

Note: Разные семейства операционных систем имеют разные соглашения относительно окончанийя строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильный(-ые) символ(ы) для вашей операционной системы. Системы семейства Unix используют \n в качестве символа конца строки, системы семейства Windows используют \r\n в качестве символов окончания строки и системы семейства Macintosh используют \r в качестве символа конца строки.
Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «смешно выглядят».
Windows предлагает флаг режима текстовой трансляции ( ‘t’), который автоматически переведёт \n во время работы с файлом. И наоборот — также вы можете использовать ‘b’ чтобы принудительно включить бинарный (двоичный) режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите ‘b’ или ‘t’ в качестве последней буквы параметра mode .
Так как установка флага трансляции по умолчанию зависит от SAPI и версии PHP, которую вы используете, рекомендуем явно задавать указанный флаг из соображений портируемости. Вы должны использовать режим ‘t’ если вы работаете с текстовым файлом и использовать \n для разделения для обозначения конца строки в вашем скрипте, при этом не беспокоясь за читаемость ваших файлов в других приложениях типа «Блокнота». В противном случае вам следует использовать флаг ‘b’.
Если вы явно не укажете флаг ‘b’ во время работы с бинарными файлами, вы можете столкнуться со странной порчей ваших данных, включая испорченные файлы изображений и странные проблемы с символами \r\n.

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

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

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

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

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

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

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

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

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

Работа с файловой системой

Создание файла

Функция fopen

Вообще говоря, в PHP не существует функции, предназначенной именно для создания файлов. Большинство функций работают с уже существующими файлами в файловой системе сервера. Есть несколько функций, которые позволяют создавать временные файлы, или, что то же самое, файлы с уникальным для текущей директории именем. А вот для того, чтобы создать самый обычный файл, нужно воспользоваться функцией, которая открывает локальный или удаленный файл. Называется эта функция fopen () . Что значит «открывает файл»? Это значит, что fopen связывает данный файл с потоком управления программы. Причем связывание бывает различным в зависимости от того, что мы хотим делать с этим файлом: читать его, записывать в него данные или делать и то и другое. Синтаксис этой функции такой:

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

Параметр имя_файла должен быть строкой, содержащей правильное локальное имя файла или URL-адрес файла в сети. Если имя файла начинается с указания протокола доступа (например, http://. или ftp://. ), то интерпретатор считает это имя адресом URL и ищет обработчик указанного в URL протокола. Если обработчик найден, то PHP проверяет, разрешено ли работать с объектами URL как с обычными файлами (директива allow_url_fopen ). Если allow_url_fopen=off , то функция fopen вызывает ошибку и генерируется предупреждение. Если имя файла не начинается с протокола, то считается, что указано имя локального файла. Чтобы открыть локальный файл, нужно, чтобы PHP имел соответствующие права доступа к этому файлу.

Параметр use_include_path , установленный в значение 1 или TRUE, заставляет интерпретатор искать указанный в fopen () файл в include_path . Напомним, что include_path — это директива из файла настроек PHP, задающая список директорий, в которых могут находиться файлы для включения. Кроме функции fopen () она используется функциями include() и require() .

Параметр тип_доступа может принимать одно из следующих значений (см. таб. 9.1).

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

Создавая файл, нужно учитывать, под какой операционной системой вы работаете, и под какой ОС предположительно этот файл будет читаться. Дело в том, что разные операционные системы по-разному отмечают конец строки. В Unix-подобных ОС конец строки обозначается \n , в системах типа Windows — \r\n . Windows предлагает специальный флаг t для перевода символов конца строки систем типа Unix в свои символы конца строки . В противоположность этому существует флаг b , используемый чаще всего для бинарных файлов , благодаря которому такой трансляции не происходит. Использовать эти флаги можно, просто дописав их после последнего символа выбранного типа доступа к файлу. Например, открывая файл на чтение, вместо r следует использовать rt , чтобы перекодировать все символы конца строки в \r\n . Если не использовать флаг b при открытии бинарных файлов , то могут появляться ошибки, связанные с изменением содержимого файла. Из соображений переносимости программы на различные платформы рекомендуется всегда использовать флаг b при открытии файлов с помощью fopen () .


Таблица 9.1. Значения принимаемые параметром тип доступа
Тип доступа Описание
r Открывает файл только для чтения; устанавливает указатель позиции в файле на начало файла.
r+ Открывает файл для чтения и записи; устанавливает указатель файла на его начало.
w Открывает файл только для записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его.
w+ Открывает файл для чтения и записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его.
a Открывает файл только для записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его.
a+ Открывает файл для чтения и записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его.
x Создает и открывает файл только для записи; помещает указатель файла на его начало. Если файл уже существует, то fopen () возвращает false и генерируется предупреждение. Если файл не существует, то делается попытка создать его. Этот тип доступа поддерживается начиная с версии PHP 4.3.2 и работает только с локальными файлами.
x+ Создает и открывает файл для чтения и записи; помещает указатель файла на его начало. Если файл уже существует, то fopen () возвращает false и генерируется предупреждение. Если файл не существует, то делается попытка создать его. Этот тип доступа поддерживается, начиная с версии PHP 4.3.2, и работает только с локальными файлами.

Что происходит, если открыть или создать файл с помощью fopen не удается? В этом случае PHP генерирует предупреждение, а функция fopen возвращает как результат своей работы значение false . Такого рода предупреждения можно «подавить» (запретить) с помощью символа @ .

Например, такая команда не выведет предупреждения, даже если открыть файл не удалось:

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

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

Функция fopen в PHP, описание и примеры

Функция fopen() закрепляет именованный ресурс за потоком, указанным в параметре $filename. В зависимости от того, как указан ресурс выбирает для него подключение и обработчик протокола для работы.

Если $filename определяется как локальный файл, будет выполняться открытие потока к этому файлу, если это позволяют права доступа.

Версия PHP 3 и выше.

function fopen($filename, $mode, $use_include_path = null , $context = null )

Параметры функции fopen

Режим открытия потока. Например, для чтения или записи. Может принимать следующие значения:

«r» — Открывает файл только для чтения.

«r+» — Открывает файл для чтения и записи.

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

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

«a» — Открывает файл для записи в конец файла. Создает новый, если файла нет.

«a+» — Открывает файл для чтения и записи в конец файла. Создает новый, если файла нет.

«x» — Создает и открывает файл только для записи, только если файла с указанным названием нет. Если файл уже есть, возвращает значение False.

«x+» — Создает и открывает файл для чтения и записи, только если файла с указанным названием нет. Если файл уже есть, возвращает значение False.

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

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

После указания режима, в параметре может быть еще значение «b» или «t», указывающее, как работать с файлом. Если указано «b», то выбран режим работы с бинарным файлом. Если «t», как с текстовым.

Разница между файлом, file_get_contents и fopen в PHP

Я новичок в PHP, и я не совсем уверен: в чем разница между функциями file() , file_get_contents() и fopen() , и когда я должен использовать один над другим?

Первые два file и file_get_contents очень похожи. Оба читают полный файл, но file читает файл в массив, а file_get_contents читает его в строку. Массив, возвращаемый file будет разделен символом новой строки, но каждый элемент все равно будет прикреплен к завершающей строке новой строки, поэтому вам все равно нужно следить за этим.

Функция fopen делает что-то совершенно другое – открывается файловый дескриптор, который функционирует как поток для чтения или записи файла. Это гораздо более низкоуровневая функция, простая обертка вокруг функции fopen , и просто вызов fopen ничего не сделает, кроме как открыть поток.

После того, как вы откроете дескриптор файла, вы можете использовать другие функции, такие как fread и fwrite чтобы манипулировать данными, к которым относится дескриптор, и как только вы закончите, вам нужно будет закрыть поток, используя fclose . Это дает вам более точный контроль над файлом, который вы читаете, и если вам нужны необработанные двоичные данные, вам может понадобиться их использовать, но обычно вы можете придерживаться функций более высокого уровня.

  • file – считывает содержимое всего файла в массив строк.
  • file_get_contents – считывает содержимое всего файла в строку.
  • fopen – открывает дескриптор файла, который можно манипулировать с помощью других функций библиотеки, но не выполняет чтение или запись.

file – считывает весь файл в массив
file_get_contents – считывает весь файл в строку
fopen – открывает файл или URL-адрес

fopen, _wfopen fopen, _wfopen

Открывает файл. Opens a file. Доступны более надежные и безопасные версии этих функций, выполняющие дополнительные проверки параметров и возвращающие коды ошибок. См. fopen_s, _wfopen_s. More-secure versions of these functions that perform additional parameter validation and return error codes are available; see fopen_s, _wfopen_s.

Синтаксис Syntax

Параметры Parameters

filename filename
Имя файла. File name.

mode mode
Включенный тип доступа. Kind of access that’s enabled.

Возвращаемое значение Return Value

Каждая из этих функций возвращает указатель на открытый файл. Each of these functions returns a pointer to the open file. Значение указателя null обозначает ошибку. A null pointer value indicates an error. Если параметр filename или mode имеет значение NULL или является пустой строкой, эти функции активируют обработчик недопустимых параметров, который описан в разделе Проверка параметров. If filename or mode is NULL or an empty string, these functions trigger the invalid parameter handler, which is described in Parameter Validation. Если выполнение может быть продолжено, эти функции возвращают значение NULL и задают значение еинвал. If execution is allowed to continue, these functions return NULL and set errno to EINVAL.

Примечания Remarks

Функция fopen открывает файл, указанный параметром filename. The fopen function opens the file that is specified by filename. По умолчанию строка с узким именем интерпретируется с помощью кодовой страницы ANSI (CP_ACP). By default, a narrow filename string is interpreted using the ANSI codepage (CP_ACP). В классических приложениях Windows эту страницу можно изменить на кодовую страницу OEM (CP_OEMCP) с помощью функции SetFileApisToOEM . In Windows Desktop applications this can be changed to the OEM codepage (CP_OEMCP) by using the SetFileApisToOEM function. С помощью функции AreFileApisANSI можно определить, интерпретируется ли имя файла с использованием ANSI или системной кодовой страницы OEM по умолчанию. You can use the AreFileApisANSI function to determine whether filename is interpreted using the ANSI or the system default OEM codepage. _wfopen — это версия fopenдля расширенных символов; аргументы для _wfopen являются строками расширенных символов. _wfopen is a wide-character version of fopen; the arguments to _wfopen are wide-character strings. В противном случае поведение _wfopen и fopen работает одинаково. Otherwise, _wfopen and fopen behave identically. Простое использование _wfopen не влияет на закодированную кодировку, используемую в файловом потоке. Just using _wfopen does not affect the coded character set that is used in the file stream.

fopen принимает пути, допустимые в файловой системе в момент выполнения. fopen принимает UNC-пути и пути, которые используют сопоставленные сетевые диски, если система, в которой выполняется код, имеет доступ к общей папке или подключенному диску во время выполнения. fopen accepts paths that are valid on the file system at the point of execution; fopen accepts UNC paths and paths that involve mapped network drives as long as the system that executes the code has access to the share or mapped drive at the time of execution. При создании путей для fopenубедитесь, что диски, пути или сетевые папки будут доступны в среде выполнения. When you construct paths for fopen, make sure that drives, paths, or network shares will be available in the execution environment. В пути в качестве разделителей каталогов можно использовать прямую (/) или обратную (\) косую черту. You can use either forward slashes (/) or backslashes (\) as the directory separators in a path.

Всегда проверяйте возвращаемое значение, чтобы узнать, равен ли указатель NULL, прежде чем выполнять какие-либо дальнейшие операции с файлом. Always check the return value to see whether the pointer is NULL before you perform any additional operations on the file. При возникновении ошибки устанавливается глобальная переменная со значением « No », которую можно использовать для получения конкретных сведений об ошибке. If an error occurs, the global variable errno is set and may be used to obtain specific error information. Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlist и _sys_nerr. For more information, see errno, _doserrno, _sys_errlist, and _sys_nerr.

Поддержка Юникода Unicode Support

fopen поддерживает файловые потоки в Юникоде. fopen supports Unicode file streams. Чтобы открыть файл Юникода, передайте флаг CCS , указывающий требуемую кодировку для fopen, как показано ниже. To open a Unicode file, pass a ccs flag that specifies the desired encoding to fopen, as follows.

File*FP = fopen («NewFile. txt», «RT +, CCS = Encoding «); FILE *fp = fopen(«newfile.txt», «rt+, ccs=encoding«);


Допустимые значения кодировки : Unicode, UTF-8и UTF-16LE. Allowed values of encoding are UNICODE, UTF-8, and UTF-16LE.

Когда файл открывается в режиме Юникода, входные функции преобразуют данные, считываемые из файла, в данные UTF-16, хранящиеся как тип wchar_t. When a file is opened in Unicode mode, input functions translate the data that’s read from the file into UTF-16 data stored as type wchar_t. Функции, записывающие в файл, Открытый в режиме Юникода, предполагают буферы, содержащие данные UTF-16, хранящиеся как тип wchar_t. Functions that write to a file opened in Unicode mode expect buffers that contain UTF-16 data stored as type wchar_t. Если кодировка файла — UTF-8, при его записи данные UTF-16 преобразуются в UTF-8, а содержимое файла с кодировкой UTF-8 преобразуется в данные UTF-16 при его считывании. If the file is encoded as UTF-8, then UTF-16 data is translated into UTF-8 when it is written, and the file’s UTF-8-encoded content is translated into UTF-16 when it is read. Попытка чтения или записи нечетного числа байт в режиме Юникода приводит к возникновению ошибки проверки параметра . An attempt to read or write an odd number of bytes in Unicode mode causes a parameter validation error. Для чтения или записи данных, хранимых в программе в кодировке UTF-8, используйте режим текстового или двоичного файла вместо режима Юникода. To read or write data that’s stored in your program as UTF-8, use a text or binary file mode instead of a Unicode mode. Вам необходимо реализовать все обязательные преобразования кодировки. You are responsible for any required encoding translation.

Если файл уже существует и открыт для чтения или добавления, метка порядка байтов (BOM), если она присутствует в файле, определяет кодирование. If the file already exists and is opened for reading or appending, the Byte Order Mark (BOM), if it present in the file, determines the encoding. Кодировка спецификации имеет приоритет над кодировкой, заданной флагом CCS . The BOM encoding takes precedence over the encoding that is specified by the ccs flag. Кодировка CCS используется только в том случае, если отсутствует спецификация или файл является новым файлом. The ccs encoding is only used when no BOM is present or the file is a new file.

Обнаружение спецификации применяется только к файлам, открываемым в режиме Юникода (то есть путем передачи флага CCS ). BOM detection only applies to files that are opened in Unicode mode (that is, by passing the ccs flag).

В следующей таблице перечислены режимы, используемые для различных флагов CCS , заданных в fopen и метках порядка байтов в файле. The following table summarizes the modes that are used for various ccs flags given to fopen and Byte Order Marks in the file.

Кодирования, используемые на основе CCS-флага и метки BOM Encodings Used Based on ccs Flag and BOM

$filename Строковый параметр, содержащий путь к ресурсу.
$mode
Флаг CCS ccs flag Нет метки BOM (или новый файл) No BOM (or new file) BOM UTF-8 BOM: UTF-8 BOM UTF-16 BOM: UTF-16
ЮНИКОД UNICODE UTF-16LE UTF-16LE UTF-8 UTF-8 UTF-16LE UTF-16LE
UTF-8 UTF-8 UTF-8 UTF-8 UTF-8 UTF-8 UTF-16LE UTF-16LE
UTF-16LE UTF-16LE UTF-16LE UTF-16LE UTF-8 UTF-8 UTF-16LE UTF-16LE

В файлы, открытые для записи в режиме Юникода, метка BOM записывается автоматически. Files opened for writing in Unicode mode have a BOM written to them automatically.

Если mode имеет значение «a, CCS = Encoding « , fopen сначала пытается открыть файл, используя доступ на чтение и запись. If mode is «a, ccs=encoding«, fopen first tries to open the file by using both read and write access. Если это завершается успешно, функция считывает метку BOM, чтобы определить кодировку для файла; если операция завершается сбоем, функция использует для файла кодировку по умолчанию. If this succeeds, the function reads the BOM to determine the encoding for the file; if this fails, the function uses the default encoding for the file. В любом случае fopen будет повторно открывать файл с помощью доступа только для записи. In either case, fopen will then re-open the file by using write-only access. (Это относится только к режиму » , а не к режиму «a +» .) (This applies to «a» mode only, not to «a+» mode.)

Сопоставления подпрограмм обработки обычного текста Generic-Text Routine Mappings

Подпрограмма TCHAR.H TCHAR.H routine _UNICODE и _MBCS не определены _UNICODE & _MBCS not defined _MBCS определено _MBCS defined _UNICODE определено _UNICODE defined
_tfopen _tfopen fopen fopen fopen fopen _wfopen _wfopen

Режим символьной строки определяет тип доступа, запрашиваемый для файла, как показано ниже. The character string mode specifies the kind of access that is requested for the file, as follows.

mode mode Access Access
«r» «r» Открывает для чтения. Opens for reading. Если файл не существует или не найден, вызов fopen завершается ошибкой. If the file does not exist or cannot be found, the fopen call fails.
«w» «w» Открывает пустой файл для записи. Opens an empty file for writing. Если указанный файл существует, его содержимое удаляется. If the given file exists, its contents are destroyed.
«a» «a» Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Opens for writing at the end of the file (appending) without removing the end-of-file (EOF) marker before new data is written to the file. Создает файл, если он не существует. Creates the file if it does not exist.
«r+» «r+» Открывает для чтения и записи. Opens for both reading and writing. Файл должен существовать. The file must exist.
«w+» «w+» Открывает пустой файл для чтения и записи. Opens an empty file for both reading and writing. Если файл существует, его содержимое удаляется. If the file exists, its contents are destroyed.
«a+» «a+» Открывается для чтения и добавления. Opens for reading and appending. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. The appending operation includes the removal of the EOF marker before new data is written to the file. Маркер EOF не восстанавливается по окончании записи. The EOF marker is not restored after writing is completed. Создает файл, если он не существует. Creates the file if it does not exist.

При открытии файла с помощью типа доступа «a» или типа доступа «a +» все операции записи выполняются в конце файла. When a file is opened by using the «a» access type or the «a+» access type, all write operations occur at the end of the file. Указатель файла может быть перемещен с помощью fseek или rewind, но всегда перемещается обратно в конец файла перед выполнением любой операции записи. The file pointer can be repositioned by using fseek or rewind, but is always moved back to the end of the file before any write operation is performed. Поэтому невозможно перезаписать существующие данные. Therefore, existing data cannot be overwritten.

Режим «a» не УДАЛЯЕТ маркер EOF перед добавлением к файлу. The «a» mode does not remove the EOF marker before it appends to the file. После добавления команда MS-DOS TYPE отображает данные только до первоначального маркера EOF и не отображает данные, добавленные в файл. After appending has occurred, the MS-DOS TYPE command only shows data up to the original EOF marker and not any data appended to the file. Перед добавлением в файл в режиме «a +» удаляется маркер EOF. Before it appends to the file, the «a+» mode does remove the EOF marker. После добавления команда TYPE MS-DOS отображает все данные в файле. After appending, the MS-DOS TYPE command shows all data in the file. Для добавления в потоковый файл, заканчивающийся маркером EOF CTRL + Z, требуется режим «a +» . The «a+» mode is required for appending to a stream file that is terminated with the CTRL+Z EOF marker.

При указании типа доступа «r +» , «w +» или «a +» разрешены операции чтения и записи (считается, что файл открыт для обновления). When the «r+», «w+», or «a+» access type is specified, both reading and writing are enabled (the file is said to be open for «update»). Однако при переходе от чтения к записи операция ввода должна получить маркер конца файла. However, when you switch from reading to writing, the input operation must encounter an EOF marker. Если маркер EOF отсутствует, необходимо воспользоваться промежуточным вызовом функции размещения файла. If there is no EOF, you must use an intervening call to a file positioning function. Функции позиционирования файлов: fsetpos, fseekи rewind. The file positioning functions are fsetpos, fseek, and rewind. При переключении с записи на чтение необходимо использовать промежуточный вызов либо fflush , либо в функцию позиционирования файла. When you switch from writing to reading, you must use an intervening call to either fflush or to a file positioning function.

В дополнение к предыдущим значениям к режиму можно добавить следующие символы, чтобы указать режим преобразования для символов новой строки. In addition to the earlier values, the following characters can be appended to mode to specify the translation mode for newline characters.

Модификатор режима mode modifier Режим преобразования Translation mode
t t Откройте файл в текстовом (переведенном) режиме. Open in text (translated) mode.
b b Открыть в двоичном (непреобразованном) режиме; переводы, включающие символы возврата каретки и перевода строки, подавляются. Open in binary (untranslated) mode; translations involving carriage-return and line feed characters are suppressed.

В текстовом режиме CTRL + Z интерпретируется как символ EOF на входе. In text mode, CTRL+Z is interpreted as an EOF character on input. В файлах, открытых для чтения и записи с помощью «a +» , FOPEN проверяет наличие CTRL + Z в конце файла и удаляет его, если это возможно. In files that are opened for reading/writing by using «a+», fopen checks for a CTRL+Z at the end of the file and removes it, if it is possible. Это делается потому, что использование fseek и ftell для перемещения в файле, заканчивающемся клавишей CTRL + Z, может привести к неправильному поведению fseek в конце файла. This is done because using fseek and ftell to move within a file that ends with CTRL+Z may cause fseek to behave incorrectly near the end of the file.

В текстовом режиме сочетания возврата каретки и перевода строки преобразуются в однострочные каналы ввода, а символы перевода строки преобразуются в сочетания символов возврата каретки и перевода строки на выходе. In text mode, carriage return-line feed combinations are translated into single line feeds on input, and line feed characters are translated to carriage return-line feed combinations on output. Если функция ввода-вывода потока Юникода работает в текстовом режиме (по умолчанию) исходный или конечный поток рассматривается как последовательность многобайтовых символов. When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Поэтому входные функции потока Юникода преобразуют многобайтовые символы в расширенные (как если бы для этого вызывалась функция mbtowc). Therefore, the Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). По той же причине выходные функции потока Юникода преобразуют расширенные символы в многобайтовые (как если бы для этого вызывалась функция wctomb). For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function).

Если t или b не задан в режиме, то режим преобразования по умолчанию определяется глобальной переменной _fmode. If t or b is not given in mode, the default translation mode is defined by the global variable _fmode. Если t или b является префиксом аргумента, функция завершается ошибкой и возвращает значение NULL. If t or b is prefixed to the argument, the function fails and returns NULL.

Дополнительные сведения об использовании текстового и двоичного режимов в Юникоде, а также многобайтового потока ввода-вывода см. в статьях Text and Binary Mode File I/O и Ввод-вывод в поток в кодировке Юникод в текстовом и двоичном режиме. For more information about how to use text and binary modes in Unicode and multibyte stream-I/O, see Text and Binary Mode File I/O and Unicode Stream I/O in Text and Binary Modes.

Следующие параметры могут быть добавлены в режим для указания дополнительных поведений. The following options can be appended to mode to specify additional behaviors.

Модификатор режима mode modifier Поведение Behavior
c c Включите флаг фиксации для связанного имени файла , чтобы содержимое файлового буфера записывалось непосредственно на диск при вызове fflush или _flushall . Enable the commit flag for the associated filename so that the contents of the file buffer are written directly to disk if either fflush or _flushall is called.
n n Сбросьте флаг фиксации для связанного файла с состоянием «без фиксации». Reset the commit flag for the associated filename to «no-commit.» Это значение по умолчанию. This is the default. Оно также переопределяет глобальный флаг фиксации при соединении программы с COMMODE.OBJ. It also overrides the global commit flag if you link your program with COMMODE.OBJ. Значение по умолчанию глобального флага фиксации — «без фиксации» (no-commit), если только программа не связана явно с файлом COMMODE.OBJ (см. статью Link Options). The global commit flag default is «no-commit» unless you explicitly link your program with COMMODE.OBJ (see Link Options).
N N Указывает, что файл не наследуется дочерними процессами. Specifies that the file is not inherited by child processes.
S S Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им. Specifies that caching is optimized for, but not restricted to, sequential access from disk.
R R Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им. Specifies that caching is optimized for, but not restricted to, random access from disk.
T T Определяет файл как временный. Specifies a file as temporary. По возможности он не сбрасывается на диск. If possible, it is not flushed to disk.
D D Определяет файл как временный. Specifies a file as temporary. Он удаляется, если закрывается последний указатель файла. It is deleted when the last file pointer is closed.
CCS = кодирование ccs=encoding Задает кодировку, используемую для этого файла (один из UTF-8, UTF-16LEили Unicode). Specifies the encoded character set to use (one of UTF-8, UTF-16LE, or UNICODE) for this file. Не указывайте никакое значение, если требуется использовать кодировку ANSI. Leave unspecified if you want ANSI encoding.

Допустимые символы для строки режима , используемой в fopen и _fdopen , соответствуют аргументам офлаг , которые используются в _open и _sopen, как показано ниже. Valid characters for the mode string that is used in fopen and _fdopen correspond to oflag arguments that are used in _open and _sopen, as follows.

Символы в строке режима Characters in mode string Эквивалентное значение офлаг для _Open_/Сопен Equivalent oflag value for _open/_sopen
a a _O_вронли | o ( обычно_o вронли),_ создание __ | __ | _ O_Append) _O_WRONLY | _O_APPEND (usually _O_WRONLY | _O_CREAT | _O_APPEND)
a + a+ _O_РДВР | | o(_обычно o РДВР o Append) _ | __ __ _ O_ создание) _O_RDWR | _O_APPEND (usually _O_RDWR | _O_APPEND | _O_CREAT )
r r _O_RDONLY _O_RDONLY
r + r+ _O_РДВР _O_RDWR
w w _O_вронли (обычно _oвронли_ | o | TRUNC_) _ __ _O_WRONLY (usually _O_WRONLY | _O_CREAT | _O_TRUNC)
w + w+ _O_РДВР (обычно _oРДВР_ | o | TRUNC_) _ __ _O_RDWR (usually _O_RDWR | _O_CREAT | _O_TRUNC)
b b _O_BINARY _O_BINARY
t t _O_TEXT _O_TEXT
c c Отсутствуют None
n n Отсутствуют None
S S _O_ПОСЛЕДОВАТЕЛЬНЫЙ _O_SEQUENTIAL
R R _O_СЛУЧАЙНЫЙ _O_RANDOM
T T _O_ШОРТЛИВЕД _O_SHORTLIVED
D D _O_ВРЕМЕННЫЕ _O_TEMPORARY
CCS = Юникод ccs=UNICODE _O_WTEXT _O_WTEXT
CCS = UTF-8 ccs=UTF-8 _O_UTF8 _O_UTF8
CCS = UTF-16LE ccs=UTF-16LE _O_UTF16 _O_UTF16

Если используется режим RB , вам не нужно переносить код, и если предполагается читать большую часть большого файла или не беспокоиться о производительности сети, можно также подумать, следует ли использовать файлы Win32, сопоставленные с памятью, в качестве параметра. If you are using rb mode, you do not have to port your code, and if you expect to read most of a large file or are not concerned about network performance, you might also consider whether to use memory mapped Win32 files as an option.

Требования Requirements

Функция Function Обязательный заголовок Required header
fopen fopen
_wfopen _wfopen или or

_wfopen — это расширение Майкрософт. _wfopen is a Microsoft extension. Дополнительные сведения о совместимости см. в разделе Совместимость. For more information about compatibility, see Compatibility.

Параметры c, n, t, S, R, tи D являются расширениями Майкрософт для fopen и _fdopen и не должны использоваться там, где требуется переносимость ANSI. The c, n, t, S, R, T, and D mode options are Microsoft extensions for fopen and _fdopen and should not be used where ANSI portability is desired.

Пример 1 Example 1

Следующая программа открывает два файла. The following program opens two files. Он использует фклосе , чтобы закрыть первый файл, и _fcloseall , чтобы закрыть все оставшиеся файлы. It uses fclose to close the first file and _fcloseall to close all remaining files.

Считывание данных из файла. Не могу открыть файл через fopen() !

Я в ступоре! Имеем простой пример

Компилим его под Visual C++ 6. В каталоге с exe-шником лежит файл file.txt. При запуске получаем

Пробовал указывать файл как «.\file.txt», и скопировов его в корень C:, указываю как «c:\file.txt». Ни один вариант не проходит, файл не виден. Атрибуты у файла обычные (в FAR нет ни одной галки на атрибутах файла).

Почему файл не открыватеся.
Что-то нужно включать/выключать в опциях компилятора?
Или это я что-то не так делаю?

1) Если программа запускается непосредственно из Visual Studio и файл file.txt лежит в папке Debug/Release вместе с .exe, то необходимо его перенести в папку проекта (там, где лежит *.dsp-файл) — рабочая папка программы по умолчанию там (сделано для того, чтобы она была одинакова для Debug и Release сборок)
2) Необходимо писать путь как «C:\\file.txt» или «C:/file.txt»

Путь пишется так: c:\\file.txt т.к. символ \ зарезервирован

gamedev.com.ua
ты написал то же что и автор, только ещё и коряво.

maker
слэш никуда не зарезервирован.
он просто означает начало спецкомбинации и потому не воспринимается как самостоятельный знак.

xintrea
тупой копипаст из демки Bullet

Господа, все оказалось так, как написал Genx

1) Если программа запускается непосредственно из Visual Studio и файл file.txt лежит в папке Debug/Release вместе с .exe, то необходимо его перенести в папку проекта (там, где лежит *.dsp-файл) — рабочая папка программы по умолчанию там (сделано для того, чтобы она была одинакова для Debug и Release сборок)
2) Необходимо писать путь как «C:\\file.txt» или «C:/file.txt»

Теперь файл открывается. Но сразу возникла другая проблема — файл не считывается (!) через функцию getc().

fopen не открывает файл полностью


Я пишу программу, которая создает таблицу поиска из двух таблиц, которые находятся в двух отдельных файлах. Когда я читаю первую таблицу, все читается правильно. Тем не менее, когда я читаю второй файл, fopen кажется, не открыть весь файл.

Я говорю это потому, что компилятор реализует _iobuf структура файла и _cnt похоже инициализируется намного ниже ( _cnt = 530 ) чем при инициализации в первый раз ( _cnt

4096 ) и, как я читал из файла, он уменьшается.

Вот фрагмент моего кода:

PS: я пытался посмотреть, что именно _cnt в FILE структура, и я не могу найти ничего подобного. Я был бы признателен за любые указания, которые может дать каждый.

Решение

Похоже, вы читаете двоичный файл в текстовом режиме. Попробуйте добавить «b» к флагам в fopen:

Также проверьте возвращаемое значение fread и, если оно меньше байтов, чем вы ожидали, проверьте код ошибки.

Другие решения

Ваш код выглядит нормально, хотя вы должны проверить возвращаемые значения fread , Если вы смотрите во внутренности FILE Вы только просите замешательство. _cnt Вероятно, связано с тем, сколько файлов буферизируется в памяти. Он не является частью API, и поэтому не документирован, и вы не должны на него смотреть.

В чем конкретно проблема? Когда делает fread потерпеть неудачу и что это возвращает?

Да, я могу читать значения, и они верны. Проблема в том, что после определенного момента, fread начинает возвращать то же значение.

Я собираюсь выйти на конечность здесь с ответом, а не продолжением обсуждения; Я удалю, если я вне базы.

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

Либо проверьте возврат fread (), либо позвоните feof() чтобы проверить ваш статус, или оба.

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

Пытаюсь в PHP открыть файл через Https. Это возможно с помощью команды fopen? У меня выдает следующую ошибку:

Warning: fopen(https://. ): failed to open stream

Заранее благодарен за помощь.

От: King Oleg http://kingoleg.livejournal.com
Дата: 21.02.06 15:21
Оценка:

Здравствуйте, Vinnyl, Вы писали:

V>Пытаюсь в PHP открыть файл через Https. Это возможно с помощью команды fopen? У меня выдает следующую ошибку:

V>Warning: fopen(https://. ): failed to open stream

V>Заранее благодарен за помощь.

fopen = https & ssl упоминается. Значит, можно. Скорее всего, проблема в настройках сервера.

От: King Oleg http://kingoleg.livejournal.com
Дата: 21.02.06 15:22
Оценка:

Здравствуйте, King Oleg, Вы писали:

KO>Здравствуйте, Vinnyl, Вы писали:

V>>Пытаюсь в PHP открыть файл через Https. Это возможно с помощью команды fopen? У меня выдает следующую ошибку:

V>>Warning: fopen(https://. ): failed to open stream

V>>Заранее благодарен за помощь.

KO>fopen = https & ssl упоминается. Значит, можно. Скорее всего, проблема в настройках сервера.

От: Neron
Дата: 01.03.06 10:17
Оценка:

Здравствуйте, Vinnyl, Вы писали:

V>Пытаюсь в PHP открыть файл через Https. Это возможно с помощью команды fopen? У меня выдает следующую ошибку:

V>Warning: fopen(https://. ): failed to open stream

V>Заранее благодарен за помощь.

Настраивается в php.ini:

allow_url_fopen — разрешает работать через URL, как с обычными файлами.

Может я ошибаюсь, поправте

От: skyogre www.qtlib.ru
Дата: 01.03.06 13:14
Оценка:

Здравствуйте, Vinnyl, Вы писали:

V>Пытаюсь в PHP открыть файл через Https. Это возможно с помощью команды fopen? У меня выдает следующую ошибку:

V>Warning: fopen(https://. ): failed to open stream

Может быть для этих целей лучше подойдёт curl? Попробуйте.

От: Vinnyl
Дата: 01.03.06 15:12
Оценка:

Здравствуйте, Neron, Вы писали:

N>

N>allow_url_fopen — разрешает работать через URL, как с обычными файлами.

N>Может я ошибаюсь, поправте

Эта настройка у меня стоит. И через http все прекрасно работает, а вот через https нет.
Мне уже помогли найти решение. Нужно использовать fsockopen. Если интересно могу привести пример.
Но все равно спасибо за помощь.

От: Vinnyl
Дата: 01.03.06 15:13
Оценка:

S>Может быть для этих целей лучше подойдёт curl? Попробуйте.

Хочется переносимости, а Curl есть не везде. Но все равно спасибо за помощь.

От: Neron
Дата: 01.03.06 15:24
Оценка:

Здравствуйте, Vinnyl, Вы писали:

V>Эта настройка у меня стоит. И через http все прекрасно работает, а вот через https нет.
V>Мне уже помогли найти решение. Нужно использовать fsockopen. Если интересно могу привести пример.
V>Но все равно спасибо за помощь.

Да, приведите пример. Было бы интересно.

От: Vinnyl
Дата: 02.03.06 05:55
Оценка:

N>Да, приведите пример. Было бы интересно.

Вот, неожитанно, но работает через https.

Почему не работает fopen на хостинге?

Здравствуйте. Столкнулся со следующей проблемой.
Локально пишу следующие строчки:

Все работает отлично, файл открывается, но если тоже самое залить на хостинг и попробовать запустить, возвращается false. Вместо __DIR__ пробовал использовать $_SERVER[‘DOCUMENT_ROOT’] Тоже не помогает.
Если ничего из них не использовать, а пользоваться относительным путем, тоже False.
phpinfo() показывает значение allow_url_fopen в On.
Если бы хостинг запрещал, вероятно падала бы ошибка вроде «. Permission denied. «, но это предположение.
Подскажите, где я допускаю ошибку?
Заранее благодарен всем отозвавшимся.

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