Что возвращает функция fopen
Функция fopen
Режим | Назначение |
---|---|
«r» | Открывает текстовый файл для чтения |
«w» | Создает текстовый файл для записи |
«а» | Дописывает в текстовый файл |
«rb» | Открывает двоичный файл для чтения |
«wb» | Создает двоичный файл для записи |
«ab» | Дописывает в двоичный файл |
«r+» | Открывает текстовый файл для чтения и записи |
«w+» | Создает текстовый файл для чтения и записи |
«а+» | Открывает текстовый файл для чтения и записи |
«rb+» или «r+b» | Открывает двоичный файл для чтения и записи |
«wb+» или «w+b» | Создает двоичный файл для чтения и записи |
«ab+» или «а+b» | Открывает двоичный файл для чтения и записи |
Как видно из таблицы, файл можно открывать либо в текстовом, либо в двоичном режиме. В текстовом режиме выполняются преобразования некоторых символов. Например, символы новой строки преобразуются в комбинацию кодов возврата каретки (ASCII 13) и конца строки (ASCII 10). В двоичном режиме подобные преобразования не выполняются.
В следующем фрагменте программы иллюстрируется корректный способ открытия файла.
Благодаря такому методу перед записью в файл выявляется любая ошибка, возникающая при его открытии, например, использование защищенного от записи или заполненного диска.
Пример
Следующий фрагмент открывает файл с названием TEST для чтения-записи в двоичном режиме.
fopen
(PHP 4, PHP 5, PHP 7, PHP 8)
fopen — Открывает файл или URL
Описание
Список параметров
Если filename передан в форме «scheme://. «, он считается URL и PHP проведёт поиск обработчика протокола (также известного как «обёртка») для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.
Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили open_basedir, то накладываются дальнейшие ограничения.
Если PHP установил, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.
На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.
Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют \n в качестве символа конца строки, системы семейства Windows используют \r\n в качестве символов окончания строки и системы семейства Macintosh (Mac OS Classic) используют \r в качестве символа конца строки.
Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «странно выглядят».
Возвращаемые значения
Возвращает указатель на файл в случае успешного выполнения или false в случае возникновения ошибки
Ошибки
Список изменений
Примеры
Пример #1 Примеры использования fopen()
Примечания
Если вы сталкиваетесь с проблемами во время чтения или записи файлов, и вы используете PHP в виде серверного модуля, убедитесь в том, что процесс сервера имеет доступ к используемым вами файлам и директориям.
Смотрите также
Что возвращает функция 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) приводит к тому, что все последующие операции записи в этот поток производятся в конец файла, как если бы перед ними была вызвана:
Функция 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=строка не указан, то широкосимвольность потока определяется по первой файловой операции. Если это операция является широкосимвольной, то поток помечается как широкосимвольный и загружаются функции для перекодировки.
Синтаксис
Параметры
pFile
Указатель на файловый указатель, который получит указатель на открытый файл.
mode
Тип разрешенного доступа.
Возвращаемое значение
Ситуации, которые могут привести к ошибке
pFile | filename | mode | Возвращаемое значение | Содержимое pFile |
---|---|---|---|---|
NULL | any | any | EINVAL | без изменений |
any | NULL | any | EINVAL | без изменений |
any | any | NULL | EINVAL | без изменений |
Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это, см. раздел глобальное состояние в CRT.
Поддержка Юникода
Обнаружение метки BOM применяется только к файлам, которые будут открываться в режиме Юникода (т. е. путем передачи флага ccs ).
Кодирования, используемые на основе CCS-флага и метки BOM
Флаг CCS | Нет метки BOM (или новый файл) | BOM: UTF-8 | BOM: UTF-16 |
---|---|---|---|
UNICODE | UTF-8 | UTF-8 | UTF-16LE |
UTF-8 | UTF-8 | UTF-8 | UTF-16LE |
UTF-16LE | UTF-16LE | UTF-8 | UTF-16LE |
В файлы, открываемые для записи в режиме Юникода, метка BOM записывается автоматически.
Универсальное текстовое сопоставление функций
Подпрограмма TCHAR.H | &Не определено _UNICODE _MBCS | _MBCS определено | _UNICODE определено |
---|---|---|---|
_tfopen_s | fopen_s | fopen_s | _wfopen_s |
Символьная строка mode указывает тип доступа, который запрошен для файла, следующим образом.
mode | Access |
---|---|
«r» | Открывает для чтения. Если файл не существует или не найден, fopen_s вызов завершается ошибкой. |
«w» | Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется. |
«a» | Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Создает файл, если он не существует. |
«r+» | Открывает для чтения и записи. Файл должен существовать. |
«w +» | Открывает пустой файл для чтения и записи. Если файл существует, его содержимое удаляется. |
«a+» | Открывается для чтения и добавления. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается после завершения записи. Создает файл, если он не существует. |
«a» Перед добавлением в файл режим не удаляет маркер конца файла. После добавления TYPE данных команда MS-DOS отображает только исходный маркер EOF, а не все данные, добавленные в файл. Перед добавлением в файл режим «a+» удаляет маркер конца файла. После добавления TYPE команда MS-DOS отображает все данные в файле. «a+» Режим необходим для добавления в потоковый файл, заканчивающийся маркером конца файла в формате » «a+» ++ «.
Начиная с C11 можно добавить «x» к или, «w» «w+» чтобы вызвать ошибку в функции, если файл существует, а не перезаписывать его.
В дополнение к приведенным выше значениям в можно включить следующие символы mode для указания режима преобразования символов новой строки:
mode Модификатор | Режим преобразования |
---|---|
t | Откройте файл в текстовом (переведенном) режиме. |
b | Открыть в двоичном (непреобразованном) режиме; переводы, включающие символы возврата каретки и перевода строки, подавляются. |
Кроме того, в текстовом режиме сочетания возврата каретки и перевода строки преобразуются в однострочные каналы ввода, а символы перевода строки преобразуются в сочетания символов возврата каретки и перевода строки на выходе. Если функция ввода-вывода потока Юникода работает в текстовом режиме (по умолчанию) исходный или конечный поток рассматривается как последовательность многобайтовых символов. Входные функции потока Юникода преобразуют многобайтовые символы в широкие символы (как при вызове mbtowc функции). По той же причине выходные функции потока Юникода преобразуют расширенные символы в многобайтовые (как если бы для этого вызывалась функция wctomb ).
Дополнительные сведения об использовании текстового и двоичного режима в Юникоде и многобайтовом потоковом вводе-выводе см. в разделах Файловый ввод-вывод в текстовом и двоичном режиме и Ввод-вывод в поток в кодировке Юникод в текстовом и двоичном режиме.
Символы в строке mode | Эквивалентное значение 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_WRONLY ) |
w+ | _O_RDWR ( _O_RDWR | _O_CREAT обычно | _O_RDWR ) |
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_s | |
_wfopen_s | или |
Дополнительные сведения о совместимости см. в разделе Compatibility.
Библиотеки
c Параметры, n и t mode являются расширениями Майкрософт для и не должны fopen_s _fdopen использоваться там, где требуется переносимость ANSI.
fopen
Функция fopen() открывает файл, имя которого указано аргументом fname, и возвращает связанный с ним указатель. Тип операций, разрешенных над файлом, определяется аргументом 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(), то любой файл, уже имевший такое же имя, будет стерт и на его месте будет создан новый файл. Если файла с таким именем не существовало, он будет создан. Если необходимо дописать что-нибудь в конец файла, то необходимо использовать режим а. Если файл не существует, будет возвращена ошибка. При открытии файла для операций чтения необходимо, чтобы он уже существовал. В противном случае будет возвращена ошибка. И наконец, если файл открывается для операций чтения/ записи, то он не стирается, если он уже существует, а если такого файла нет, он создается.