Fopen открыть файл


Содержание

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=строка не указан, то широкосимвольность потока определяется по первой файловой операции. Если это операция является широкосимвольной, то поток помечается как широкосимвольный и загружаются функции для перекодировки.

Fopen открыть файл

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

Описание

int fopen (string filename, string mode [, int use_include_path])

Если filename начинается с «http://» (нечувствительно к регистру), то HTTP 1.0 соединение открывается со специфицированным сервером, страница запрашивается методом HTTP GET и указатель файла возвращается в начало тела ответа. ‘Host:’-header отправляется вместе с запросом, чтобы обработать виртуальные хосты на основе имён.

Начиная с PHP 4.3.0, если вы скомпилировали поддержку OpenSSL, вы можете использовать «https://» для открытия HTTP-соединения через SSL.

Обратите внимание, что указатель файла позволяет вам запрашивать только body\тело ответа; для запрашивания шапки/header HTTP-ответа вам нужно использовать PHP 4.0.5 или новее; эти шапки будут храниться в переменной $http_response_header. Начиная с PHP 4.3.0, header-информация может быть запрошена с использованием функции file_get_wrapper_data() .

HTTP-соединения являются read-only; вы не можете записывать данные или копировать файлы в HTTP-ресурс.

Версии до PHP 4.0.5 не обрабатывают HTTP-перенаправления. Поэтому директории обязаны иметь ведомые слэши.

Если filename начинается с «ftp://» (нечувствительно к регистру), открывается ftp-соединение со специфицированным сервером и возвращается указатель на запрашиваемый файл. Если сервер не поддерживает ftp пассивного режима, это не удастся сделать. Вы можете открывать файлы для чтения или записи через ftp (но не для того и другого одновременно). Если удалённый/remote файл уже существует на ftp-сервере и вы пытаетесь открыть его для записи, это не получится. Если вам нужно обновить существующие файлы по ftp, используйте ftp_connect() .

Если filename это «php://stdin», «php://stdout» или «php://stderr», будет открыт соответствующий поток stdio. (Это появилось в PHP 3.0.13; до этого такие имена файлов, как «/dev/stdin» или «/dev/fd/0», должны были использоваться для доступа к stdio-потокам.)

Если filename начинается ещё с чего-нибудь, файл будет открыт из файловой системы и будет возвращён указатель на открытый файл.

Если открыть файл не удалось, эта функция возвращает FALSE .

mode может иметь значения:


‘r’ — Открыть только для чтения; поместить указатель в начало файла.

‘r+’ — Открыть для чтения и записи; поместить указатель в начало файла.

‘w’ — Открыть только для записи; поместить указатель в начало файла и усечь файл до нулевой длины. Если файл не существует, делается попытка создать его.

‘w+’ — Открыть для чтения и записи; поместить указатель в начало файла и усечь файл до нулевой длины. Если файл не существует, делается попытка создать его.

‘a’ — Открыть только для записи; поместить указатель в конец файла. Если файл не существует, делается попытка создать его.

‘a+’ — Открыть для чтения и записи; поместить указатель в конец файла. Если файл не существует, делается попытка создать его.

Примечание: mode может содержать букву ‘b’. Это используется только в системах, различающих двоичные и текстовые файлы (т.е. в Windows. В Unix это бесполезно). Если не нужен, он игнорируется.

Вы можете использовать необязательный третий параметр и установить в него значение «1», если хотите найти файл также и в include_path.

Пример 1. fopen()

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

На платформе Windows мнемонизируйте (escape) все обратные слэши в пути к файлу или используйте обычные слэши.

fopen

Функция fopen() открывает файл, имя которого указано аргументом fname, и возвращает свя­занный с ним указатель. Тип операций, разрешенных над файлом, определяется аргументом mode. Разрешенные для mode значения показаны в таблице.

Таблица: Допустимые значения для mode

Режим Значение
«r» Создает файл для записи (по умолчанию файл открывается как текстовый).
«w» Создает файл для записи (по умолчанию файл открывается как текстовый).
«а» Дописывает информацию к концу файла (по умолчанию файл открывается как текстовый).
«rb» Открывает двоичный файл для чтения.
«wb» Создает двоичный файл для записи.
«ab» Дописывает информацию к концу двоичного файла.
«r+» Открывает файл для чтения/записи (по умолчанию файл открывается как текстовый).
«w+» Создает файл для чтения/записи (по умолчанию файл открывается как текстовый).
«а+» Дописывает информацию к концу файла или создает файл для чтения/записи (по умолчанию открывается как текстовый файл).
«r+b» Открывает двоичный файл для чтения / записи.
«w+b» Создает файл для чтения / записи.
«а+b» Дописывает информацию к концу файла или создает двоичный файл для чтения.
«rt» Открывает текстовый файл для чтения.
«wt» Открывает текстовый файл для записи.
«at» Дописывает информацию к концу текстового файла.
«r+t» Открывает текстовый файл для чтения/записи.
«w+t» Создает текстовый файл для чтения/записи.
«a+t» Открывает или создает текстовый файл для чтения/записи.

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

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

Как показано в таблице, файл может быть открыт либо в двоичном, либо в текстовом режиме. В текстовом режиме возврат каретки и последовательности перевода строки при вводе транслируется в символы «новая строка». При выводе — наоборот: символ новой строки транс­лируются в возврат каретки и перевод строки. Такого рода трансляция не производится при работе с двоичными файлами.

Если строка mode не задает ни b (для двоичных), ни t (для текстовых файлов), то тип открыва­емого файла определяется значением встроенной глобальной переменной _fmoae. По умолчанию _fmode принимает значение O_ТЕХТ, что означает текстовый режим. Она может быть установле­на и в O_BINARY, что означает двоичный режим. Эти макросы определены в fcntl.h.

Один из рекомендуемых методов открытия файла проиллюстрирован следующим фрагментом кода:
FILE *fp;
if ((fp = fopen(«test», «w»))==NULL) <
printf(«Cannot open file.\n»);
exit(1);
>

При открытии файла этот метод контролирует возможность ошибок при открытии, например, проверяет наличие защиты от записи или отсутствие места на диске перед попыткой записи на диск. NULL, т.е. 0, используется потому, что указатели файлов никогда не принимают этого значения. NULL определен в stdio.h.

Если при операции записи для открытия файла используется функция fopen(), то любой файл, уже имевший такое же имя, будет стерт и на его месте будет создан новый файл. Если файла с таким именем не существовало, он будет создан. Если необходимо дописать что-нибудь в конец файла, то необходимо использовать режим а. Если файл не существует, будет возвращена ошиб­ка. При открытии файла для операций чтения необходимо, чтобы он уже существовал. В против­ном случае будет возвращена ошибка. И наконец, если файл открывается для операций чтения/ записи, то он не стирается, если он уже существует, а если такого файла нет, он создается.

fopen

(PHP 3, PHP 4, PHP 5)

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

Описание

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

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

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

Замечание: Некоторые протоколы поддерживают context и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется обвёрткой http ). Для получения описания параметров contexts и zcontext , обратитесь к разделу Stream Functions .

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

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

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

Таблица 1. Список возможных режимов для 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 и выше, и работает только для локальных файлов.

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

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

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

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

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

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

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

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

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

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

= fopen ( «/home/rasmus/file.txt» , «r» );
$handle = fopen ( «/home/rasmus/file.gif» , «wb» );
$handle = fopen ( «http://www.example.com/» , «r» );
$handle = fopen ( «ftp://user:password@example.com/somefile.txt» , «w» );
?>

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

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

= fopen ( «c:\\data\\info.txt» , «r» );
?>

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

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

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

Для удобства обращения информация в запоминающих устройствах хранится в виде файлов.

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

Каталог ( папка , директория ) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.

Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).

Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт).

Рассмотрим структуру файловой системы на примере FAT32.

Файловая структура FAT32

Устройства внешней памяти в системе FAT32 имеют не байтовую, а блочную адресацию. Запись информации в устройство внешней памяти осуществляется блоками или секторами.

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

Кластер – объединение нескольких секторов, которое может рассматриваться как самостоятельная единица, обладающая определёнными свойствами. Основным свойством кластера является его размер, измеряемый в количестве секторов или количестве байт.

Файловая система FAT32 имеет следующую структуру.

Нумерация кластеров, используемых для записи файлов, ведется с 2. Как правило, кластер №2 используется корневым каталогом, а начиная с кластера №3 хранится массив данных. Сектора, используемые для хранения информации, представленной выше корневого каталога, в кластеры не объединяются.
Минимальный размер файла, занимаемый на диске, соответствует 1 кластеру.

Загрузочный сектор начинается следующей информацией:

  • EB 58 90 – безусловный переход и сигнатура;
  • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
  • 00 02 – количество байт в секторе (обычно 512);
  • 1 байт – количество секторов в кластере;
  • 2 байта – количество резервных секторов.

Кроме того, загрузочный сектор содержит следующую важную информацию:

  • 0x10 (1 байт) – количество таблиц FAT (обычно 2);
  • 0x20 (4 байта) – количество секторов на диске;
  • 0x2С (4 байта) – номер кластера корневого каталога;
  • 0x47 (11 байт) – метка тома;
  • 0x1FE (2 байта) – сигнатура загрузочного сектора ( 55 AA ).

Сектор информации файловой системы содержит:

  • 0x00 (4 байта) – сигнатура ( 52 52 61 41 );
  • 0x1E4 (4 байта) – сигнатура ( 72 72 41 61 );
  • 0x1E8 (4 байта) – количество свободных кластеров, -1 если не известно;
  • 0x1EС (4 байта) – номер последнего записанного кластера;
  • 0x1FE (2 байта) – сигнатура ( 55 AA ).

Таблица FAT содержит информацию о состоянии каждого кластера на диске. Младшие 2 байт таблицы FAT хранят F8 FF FF 0F FF FF FF FF (что соответствует состоянию кластеров 0 и 1, физически отсутствующих). Далее состояние каждого кластера содержит номер кластера, в котором продолжается текущий файл или следующую информацию:

  • 00 00 00 00 – кластер свободен;
  • FF FF FF 0F – конец текущего файла.

Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:

  • 8 байт – имя файла;
  • 3 байта – расширение файла;

Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:

  • 8 байт – имя файла;
  • 3 байта – расширение файла;
  • 1 байт – атрибут файла:
  • 1 байт – зарезервирован;
  • 1 байт – время создания (миллисекунды) (число от 0 до 199);
  • 2 байта – время создания (с точностью до 2с):
  • 2 байта – дата создания:
  • 2 байта – дата последнего доступа;
  • 2 байта – старшие 2 байта начального кластера;
  • 2 байта – время последней модификации;
  • 2 байта – дата последней модификации;
  • 2 байта – младшие 2 байта начального кластера;
  • 4 байта – размер файла (в байтах).


В случае работы с длинными именами файлов (включая русские имена) кодировка имени файла производится в системе кодировки UTF-16. При этого для кодирования каждого символа отводится 2 байта. При этом имя файла записывается в виде следующей структуры:

  • 1 байт последовательности;
  • 10 байт содержат младшие 5 символов имени файла;
  • 1 байт атрибут;
  • 1 байт резервный;
  • 1 байт – контрольная сумма имени DOS;
  • 12 байт содержат младшие 3 символа имени файла;
  • 2 байта – номер первого кластера;
  • остальные символы длинного имени.

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

Работа с файлами в языке Си

Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода . Выводимая информация записывается в поток, вводимая информация считывается из потока.

Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE , которая определена в stdio.h . Структура FILE содержит необходимую информацию о файле.

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

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

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

Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose() .

Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF , если произошла ошибка.

Чтение символа из файла:


Аргументом функции является указатель на поток типа FILE . Функция возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF .

Запись символа в файл:

Аргументами функции являются символ и указатель на поток типа FILE . Функция возвращает код считанного символа.

Функции fscanf() и fprintf() аналогичны функциям scanf() и printf() , но работают с файлами данных, и имеют первый аргумент — указатель на файл.

Функции fgets() и fputs() предназначены для ввода-вывода строк, они являются аналогами функций gets() и puts() для работы с файлами.


Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки ‘\n’ , который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное символов. Результат помещается в указатель на строку и заканчивается нуль- символом ‘\0’ . Функция возвращает адрес строки.

fopen

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

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

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

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

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

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

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

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

Документация

Открытый файл, или получают информацию об открытых файлах

Синтаксис

Описание

file > открывает файл, filename , для бинарного доступа для чтения, и возвращает целочисленный идентификатор файла, равный или больше, чем 3. MATLAB ® резервирует идентификаторы файла 0 , 1 и 2 для стандартного входа, стандартный вывод (экран), и стандартная погрешность, соответственно.

Если fopen не может открыть файл, то fileID является -1 .

file > открывает файл с типом доступа, заданного permission .

file > дополнительно задает порядок для чтения или записи байтов или битов в файле с помощью аргумента machinefmt . Дополнительный аргумент encodingIn задает схему кодировки символов, сопоставленную с файлом.

[file > дополнительно возвращает системно-зависимое сообщение об ошибке, если fopen не удается открыть файл. В противном случае errmsg является пустым символьным вектором. Можно использовать этот синтаксис с любым из входных параметров предыдущих синтаксисов.

f ) возвращает вектор — строку, содержащий идентификаторы файла всех открытых файлов. Идентификаторы, зарезервированные для стандартного входа, вывода и ошибки, не включены. Число элементов в векторе равно количеству открытых файлов.

filename = fopen(fileID) возвращает имя файла, которое использовал предыдущий вызов fopen , когда это открыло файл, заданный fileID . Выходное имя файла разрешено к полному пути. Функция fopen не считывает информации из файла, чтобы определить выходное значение.

[filename,permission,machinefmt,encodingOut] = fopen(fileID) дополнительно возвращает разрешение, формат машины и кодирование, которое использовал предыдущий вызов fopen , когда это открыло заданный файл. Если файл был открыт в режиме двоичного счета, permission включает букву ‘b’ . encodingOut вывод является стандартным именем схемы кодирования. fopen не считывает информации из файла, чтобы определить эти выходные значения. Недопустимый fileID возвращает пустые символьные вектора для всех выходных аргументов.

Примеры

Открытый идентификатор файла и передачи к функции файлового ввода-вывода

Откройте файл и передайте идентификатор файла функции fgetl , чтобы считать данные.

Откройте файл, tsunamis.txt , и получите идентификатор файла.

Передайте fileID функции fgetl , чтобы прочитать одну строку из файла.

Запрос имени файла открыться

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

Открытый файл для записи и задает тип доступа, пишущий порядок, кодировку символов

Откройте файл, чтобы записать в файл с помощью кодировки символов Shift JIS.

Вход ‘w’ задает доступ для записи, вход ‘n’ задает нативный порядок байтов, и ‘Shift_JIS’ задает схему кодировки символов.

Получение информации об открытых файлах

Предположим, что вы ранее открыли файл с помощью fopen .

Получите идентификаторы файла всех открытых файлов.

Получите имя файла и кодировку символов для открытого файла. Используйте

вместо выходных аргументов, которые вы хотите не использовать.

Вывод, показанный здесь, является представительным. Ваши результаты могут отличаться.

Входные параметры

fileName Имя файла, чтобы открыться
вектор символов или скаляр строки

Имя файла, чтобы открыться, включая расширение файла, заданное как символьный вектор — строка или скаляр строки. Если файл не находится в текущей папке, filename должен включать полное или относительный путь.

В системах UNIX ® , если filename начинается с ‘

username/’ , функция fopen расширяет путь к корневому каталогу текущего или заданного пользователя, соответственно.

Если вы открываете файл с доступом для чтения, и файл не находится в текущей папке, то fopen ищет вдоль пути поиска файлов MATLAB.

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

Пример: ‘myFile.txt’

Типы данных: char | string

permission — Тип доступа к файлу
‘r’ (значение по умолчанию) | ‘w’ | ‘a’ | ‘r+’ | ‘w+’ | ‘a+’ | ‘A’ | ‘W’ |.

Тип доступа к файлу, заданный как вектор символов или скаляр строки. Можно открыть файл в режиме двоичного счета или в текстовом режиме. В системах UNIX оба режима перевода имеют тот же эффект. Чтобы открыть файл в режиме двоичного счета, задайте одно из следующих.

Открытый файл для чтения.

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

Откройте или создайте новый файл для записи. Добавьте данные в конец файла.

Открытый файл для чтения и записи.

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

Откройте или создайте новый файл для чтения и записи. Добавьте данные в конец файла.

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

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

Чтобы открыть файлы в текстовом режиме, присоедините букву ‘t’ к аргументу permission , такому как ‘rt’ или ‘wt+’ .

В системах Windows ® , в текстовом режиме:

Операции чтения, которые сталкиваются с возвратом каретки, сопровождаемым символом новой строки ( ‘\r\n’ ), удаляют возврат каретки из входа.

Операции записи вставляют возврат каретки перед любым символом новой строки в выводе.

Откройте или создайте новый файл в текстовом режиме, если вы хотите записать в него в MATLAB и затем открыть его в Блокноте Microsoft ® или каком-либо текстовом редакторе, который не распознает ‘\n’ последовательностью новой строки. При записи в файл закончите каждую строку ‘\r\n’ . Для примера смотрите fprintf . В противном случае откройте файлы в режиме двоичного счета для лучшей производительности.

Читать и записать в тот же файл:

Откройте файл со значением для permission , который включает знак «плюс», ‘+’ .

Вызовите fseek или frewind между операциями чтения и операциями записи. Например, не вызывайте fread , сопровождаемый fwrite или fwrite , сопровождаемым fread , если вы не вызываете fseek или frewind между ними.

Типы данных: char | string

machinefmt Порядок для чтения или записи байтов или битов
‘n’ (значение по умолчанию) | ‘b’ | ‘l’ | ‘s’ | ‘a’ |.

Порядок для чтения или записи байтов или битов в файле, заданном как один из следующих векторов символов или скаляров строки.

Ваш системный порядок байтов (значение по умолчанию)

Упорядоченное расположение с обратным порядком байтов

Упорядоченное расположение с прямым порядком байтов

‘s’ или ‘ieee-be.l64’

Упорядоченное расположение обратного порядка байтов, 64-битный долгий тип данных

‘a’ или ‘ieee-le.l64’

Упорядоченное расположение прямого порядка байтов, 64-битный долгий тип данных

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

Типы данных: char | string

encodingIn ‘CharacterEncoding’
‘UTF-8’ | ‘ISO-8859-1’ | ‘windows-1251’ | ‘windows-1252’ |.

Кодировка символов, чтобы использовать для последующих операций чтения и операций записи, включая fscanf , fprintf , fgetl , fgets , fread и fwrite , заданный как вектор символов или скаляр строки. Вектор символов или скаляр строки должны содержать имя схемы кодирования стандартного символа, такое как следующее.

Если вы не задаете схему кодирования, fopen открывает файлы для обработки использования кодировки по умолчанию для вашей системы. Для получения дополнительной информации смотрите Вводные Файлы с Различными Кодировками символов.

Если вы задаете значение для кодирования, которое не находится в списке поддерживаемых значений, MATLAB выдает предупреждение. Определение других имен кодирования иногда (но не всегда) приводит к правильным результатам.

Типы данных: char | string

fileID — Идентификатор файла открытого файла
целое число

Идентификатор файла открытого файла, заданного как целое число.

Типы данных: double

Советы

В большинстве случаев не необходимо открыть файл в текстовом режиме. Функции импорта MATLAB, все приложения UNIX, и Microsoft Word и WordPad распознают ‘\n’ индикатором новой строки.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Указания и ограничения по применению:

Генерация кода не поддерживает:

Входные параметры machinefmt , encodingIn или fileID .

Выходной аргумент errmsg .

Открытие файла в текстовом режиме. Это — аргумент permission , не должен содержать букву t . Например, значением не может быть ‘rt’ .

Аргумент permission может содержать три символа самое большее. Символы должны быть уникальными.

Если вы отключаете внешние вызовы, то вы не можете возвратить идентификаторы файла, созданные с fopen к функциям MATLAB или внешним функциям. Используйте эти идентификаторы файла только внутренне.

При генерации исполняемых файлов C/C++, статических библиотек или динамических библиотек, можно открыть до 20 файлов.

Сгенерированный код не сообщает об ошибках от недопустимых идентификаторов файла. Запишите свою собственную обработку ошибки открытия файла в вашем коде MATLAB. Протестируйте, возвращает ли fopen -1 , который указывает, что открытый файл перестал работать. Например:

Поведение сгенерированного кода для fread зависимо компилятором когда вы:

Откройте файл с помощью fopen с permission a+ .

Считайте файл с помощью fread прежде, чем вызвать функцию ввода-вывода, такую как fseek или frewind , который устанавливает индикатор позиции в файле.


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

Представлено до R2006a

Документация MATLAB
Поддержка

© 1994-2020 The MathWorks, Inc.

1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

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

Fopen открыть файл

Опубликовано: Октябрь 2020

Самая актуальная документация по Visual Studio 2020: Документация по Visual Studio 2020.

Открывает файл. Доступны более надежные и безопасные версии этих функций, выполняющие дополнительные проверки параметров и возвращающие коды ошибок. См. fopen_s, _wfopen_s.

Параметры

filename
Имя файла.

mode
Включенный тип доступа.

Каждая из этих функций возвращает указатель на открытый файл. Значение указателя null обозначает ошибку. Если filename или mode — NULL или пустой строкой, эти функции активируют обработчик недопустимого параметра, который описан в проверки параметров. Если продолжение выполнения разрешено, эти функции возвращают NULL и устанавливают для errno значение EINVAL .

Функция fopen открывает файл, заданный filename . По умолчанию узкая строка filename интерпретируется с использованием кодовой страницы ANSI (CP_ACP). В классических приложениях Windows эту страницу можно изменить на кодовую страницу OEM (CP_OEMCP) с помощью функции SetFileApisToOEM . Функцию AreFileApisANSI можно использовать для определения, интерпретируется ли filename с использованием кодовой страницы ANSI или кодовой страницы OEM системы по умолчанию. _wfopen — это двухбайтовая версия fopen ; аргументы для _wfopen представляют собой двухбайтовые строки. В противном случае поведение _wfopen и fopen идентично. Использование исключительно _wfopen не влияет на набор закодированных символов, используемый в файловом потоке.

fopen принимает пути, допустимые в файловой системе, в точке выполнения; fopen принимает UNC-пути и пути, содержащие сопоставленные сетевые диски, если выполняющая код система имеет доступ к общей папке или сопоставленному диску во время выполнения. При построении путей для fopen убедитесь, что драйверы, пути или сетевые общие папки будут доступны в среде выполнения. Можно использовать символы косой черты (/) или обратной косой черты (\) в качестве разделителей каталогов в пути.

Всегда проверяйте возвращаемое значение, чтобы узнать, равен ли указатель NULL, прежде чем выполнять какие-либо дальнейшие операции с файлом. При возникновении ошибки задается глобальная переменная errno , которая может использоваться для получения конкретных сведений об ошибке. Дополнительные сведения см. в разделе errno _doserrno, _sys_errlist и _sys_nerr.

fopen поддерживает файловые потоки Юникода. Чтобы открыть файл Юникода, передайте флаг ccs , задающий нужную кодировку, в fopen следующим образом.

FILE *fp = fopen(«newfile.txt», «rt+, ccs=encoding»);

Допустимые значения encoding — UNICODE , UTF-8 и UTF-16LE .

Если файл открывается в режиме Юникода, функции ввода преобразуют данные, считываемые из файла в данные UTF-16, хранимые с типом wchar_t . Затем функции, которые выполняют запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие данные UTF-16, хранимые с типом wchar_t . Если кодировка файла — UTF-8, при его записи данные UTF-16 преобразуются в UTF-8, а содержимое файла с кодировкой UTF-8 преобразуется в данные UTF-16 при его считывании. Попытка чтения или записи нечетного числа байт в режиме Юникода приводит к возникновению ошибки проверки параметра . Для чтения или записи данных, хранимых в программе в кодировке UTF-8, используйте режим текстового или двоичного файла вместо режима Юникода. Вам необходимо реализовать все обязательные преобразования кодировки.

Если файл уже существует и открыт для чтения или добавления, метка порядка байтов (BOM), если она присутствует в файле, определяет кодирование. Кодирование BOM имеет приоритет над кодированием, заданным флагом ccs . Кодирование ccs используется, только если метка BOM отсутствует или речь идет о новом файле.

Внимание

Обнаружение метки BOM применяется только к файлам, которые будут открываться в режиме Юникода (т е путем передачи флага ccs ).

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

Кодирования, используемые на основе CCS-флага и метки BOM

Примечание
Флаг ccs Нет метки BOM (или новый файл) BOM: UTF-8 BOM: UTF-16
UNICODE UTF-16LE UTF-8 UTF-16LE
UTF-8 UTF-8 UTF-8 UTF-16LE
UTF-16LE UTF-16LE UTF-8 UTF-16LE

В файлы, открытые для записи в режиме Юникода, метка BOM записывается автоматически.

Если mode — a, ccs= , то fopen сначала пытается открыть файл с правами на чтение и доступ. Если это завершается успешно, функция считывает метку BOM, чтобы определить кодировку для файла; если операция завершается сбоем, функция использует для файла кодировку по умолчанию. В любом случае fopen затем снова открывает файл с правами только на запись. (Это актуально только для режима a , а не a+ ).

Универсальное текстовое сопоставление функций

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

Символьная строка mode указывает тип доступа, который запрошен для файла, следующим образом.

«r»
Открывает для чтения. Если файл не существует или его невозможно найти, вызов fopen завершается ошибкой.

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

«a»
Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Создает файл, если он не существует.

«r+»
Открывает для чтения и записи. Файл должен существовать.

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

«a+»
Открывается для чтения и добавления. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается по окончании записи. Создает файл, если он не существует.

Если файл открывается с помощью типа доступа «a» или «a+» , все операции записи выполняются в конце файла. Указатель файла может быть перемещен с помощью fseek или rewind , но он всегда возвращается в конец файла перед выполнением любой операции записи. Поэтому невозможно перезаписать существующие данные.

Режим «a» не удаляет маркер EOF, прежде чем будет выполнено добавление в файл. После добавления команда MS-DOS TYPE отображает данные только до первоначального маркера EOF и не отображает данные, добавленные в файл. Перед добавлением в файл режим «a+» удаляет маркер EOF. После добавления команда TYPE MS-DOS отображает все данные в файле. Режим «a+» необходим для добавления в потоковый файл, завершаемый маркером конца файла CTRL+Z.

Если задан тип доступа «r+» , «w+» или «a+» , чтение и запись разрешены (считается, что файл открыт для обновления). Однако при переходе от чтения к записи операция ввода должна получить маркер конца файла. Если маркер EOF отсутствует, необходимо воспользоваться промежуточным вызовом функции размещения файла. Функции размещения файла — fsetpos , fseek и rewind . При переходе от записи к чтению необходимо воспользоваться промежуточным вызовом функции fflush или функции размещения файла.

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

t
Откройте файл в текстовом (переведенном) режиме. В этом режиме CTRL+Z интерпретируется как символ конца файла на входе. В файлах, открытых для чтения или записи с помощью «a+» , fopen проверяет наличие CTRL + Z в конце файла и удаляет его, если это возможно. Это делается потому, что использование fseek и ftell для перемещения в файле, который заканчивается CTRL+Z, может вызвать неправильное поведение fseek ближе к концу файла.

В текстовом режиме сочетания символов возврата каретки и перевода строки переводятся в один символ перевода строки на входе, а символы перевода строки преобразуются на выходе в сочетания символов возврата каретки и перевода строки. Если функция ввода-вывода потока Юникода работает в текстовом режиме (по умолчанию) исходный или конечный поток рассматривается как последовательность многобайтовых символов. Поэтому входные функции потока Юникода преобразуют многобайтовые символы в расширенные (как если бы для этого вызывалась функция mbtowc ). По той же причине выходные функции потока Юникода преобразуют расширенные символы в многобайтовые (как если бы для этого вызывалась функция wctomb ).

b
При открытии в двоичном (непреобразованном) режиме преобразования, включающие символы возврата каретки и перевода строки, подавляются.

Если символ t или b в параметре mode не указан, режим преобразования по умолчанию определяется глобальной переменной _fmode. Если символ t или b указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL .

Дополнительные сведения об использовании текстового и двоичного режимов в Юникоде, а также многобайтового потока ввода-вывода см. в статьях Text and Binary Mode File I/O и Unicode Stream I/O in Text and Binary Modes.

c
Включите флажок фиксации для связанного объекта filename , чтобы содержимое файлового буфера записывалось непосредственно на диск при вызове fflush или _flushall .

n
Сбросьте флажок фиксации для связанного объекта filename , задайте для него значение «без фиксации». Это значение по умолчанию. Оно также переопределяет глобальный флаг фиксации при соединении программы с COMMODE.OBJ. Значение по умолчанию глобального флага фиксации — «без фиксации» (no-commit), если только программа не связана явно с файлом COMMODE.OBJ (см. статью Link Options).

N
Указывает, что файл не наследуется дочерними процессами.

S
Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им.

R
Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им.

T
Определяет файл как временный. По возможности он не сбрасывается на диск.

D
Определяет файл как временный. Он удаляется, если закрывается последний указатель файла.

ccs=ENCODING
Задает набор кодированных символов, которые требуется использовать ( UTF-8 , UTF-16LE или UNICODE ) для этого файла. Не указывайте никакое значение, если требуется использовать кодировку ANSI.

Допустимые символы для строки mode , используемой в fopen и _fdopen , соответствуют аргументам oflag , которые используются в _open и _sopenследующим образом.

Символы в строке режима Эквивалентный oflag значение _open / _sopen
a _O_WRONLY | _O_APPEND (обычно _O_WRONLY | _O_CREAT | _O_APPEND )
a+ _O_RDWR | _O_APPEND (обычно _O_RDWR | _O_APPEND | _O_CREAT )
r _O_RDONLY
r+ _O_RDWR
w _O_WRONLY (обычно _O_WRONLY | _O_CREAT | _O_TRUNC )
w+ _O_RDWR (обычно _O_RDWR | _O_CREAT | _O_TRUNC )
b _O_BINARY
t _O_TEXT
c Нет
n Нет
S _O_SEQUENTIAL
R _O_RANDOM
T _O_SHORTLIVED
D _O_TEMPORARY
ccs=UNICODE _O_WTEXT
ccs=UTF-8 _O_UTF8
ccs=UTF-16LE _O_UTF16

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

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

_wfopen является расширением Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.

Параметры c , n , t , S , R , T и D mode представляют собой расширения Майкрософт для fopen и _fdopen и should not be used where ANSI portability is desired.

Следующая программа открывает два файла. Она использует fclose для закрытия первого файла и _fcloseall для закрытия всех остальных файлов.

Функция Fopen

Функция Fopen открывает файл или URL.
Функция Fopen закрепляет именованный ресурс, указанный в аргументе Filename, за потоком.

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

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

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

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

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

r‘ — Открывает файл только для чтения и помещает указатель в начало файла.

r+‘ — Открывает файл для чтения и записи и помещает указатель в начало файла.

w‘ — Открывает файл только для записи и помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пробует его создать.

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

a‘ — Открывает файл только для записи и помещает указатель в конец файла. Если файл не существует — пытается его создать.

A+‘ — Открывает файл для чтения и записи и помещает указатель в конец файла. Если файл не существует — пытается его создать.

x‘ — Создает и открывает только для записи и помещает указатель в начало файла. Если файл уже существует, вызов Fopen закончится неудачей, вернет FALSE и выдаст ошибку уровня E_WARNING.

x+‘ — Создает и открывает для чтения и записи и в остальном имеет то же поведение что и ‘x’.

c‘ — Открывает файл только для записи. Если файл не существует, то он создается. Если же файл существует, то он не обрезается (в отличии от ‘w’), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’). Указатель на файл будет установлен на начало файла.

c+‘ — Открывает файл для чтения и записи. В остальном имеет то же поведение, что и ‘c’.

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

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

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

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

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

Параметр Context задает контекст.

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

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

Пример использования:
Результат выполнения:

fopen

(PHP 3, PHP 4, PHP 5)

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

Описание

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

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

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

Замечание: Некоторые протоколы поддерживают context и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется обвёрткой http ). Для получения описания параметров contexts и zcontext , обратитесь к разделу Stream Functions .

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

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

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

Таблица 1. Список возможных режимов для 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 и выше, и работает только для локальных файлов.

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

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

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

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

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

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

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

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

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

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

= fopen ( «/home/rasmus/file.txt» , «r» );
$handle = fopen ( «/home/rasmus/file.gif» , «wb» );
$handle = fopen ( «http://www.example.com/» , «r» );
$handle = fopen ( «ftp://user:password@example.com/somefile.txt» , «w» );
?>

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

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

= fopen ( «c:\\data\\info.txt» , «r» );
?>

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

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

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