Fwrite писать в файл

Содержание

Практическое руководство. Запись текста в файл How to: Write text to a file

В этом разделе показаны различные способы записи текста в файл для приложения .NET. This topic shows different ways to write text to a file for a .NET app.

Для записи текста в файл обычно используются следующие классы и методы. The following classes and methods are typically used to write text to a file:

StreamWriter содержит методы для синхронной (Write или WriteLine) или асинхронной (WriteAsync и WriteLineAsync) записи в файл. StreamWriter contains methods to write to a file synchronously (Write and WriteLine) or asynchronously (WriteAsync and WriteLineAsync).

File предоставляет статические методы для записи текста в файл, такие как WriteAllLines и WriteAllText, или для добавления текста в файл (AppendAllLines, AppendAllText или AppendText). File provides static methods to write text to a file, such as WriteAllLines and WriteAllText, or to append text to a file, such as AppendAllLines, AppendAllText, and AppendText.

Path предназначен для использования со строками, содержащими сведения о пути к файлу или каталогу. Path is for strings that have file or directory path information. Он содержит метод Combine; в .NET Core 2.1 и более поздних версиях также есть методы Join и TryJoin, которые позволяют объединять строки для создания пути к файлу или каталогу. It contains the Combine method and, in .NET Core 2.1 and later, the Join and TryJoin methods, which allow concatenation of strings to build a file or directory path.

Нижеприведенные примеры демонстрируют минимальный объем необходимого кода. The following examples show only the minimum amount of code needed. Реальное приложение обычно обеспечивает более надежную проверку ошибок и обработку исключений. A real-world app usually provides more robust error checking and exception handling.

Пример Синхронная запись текста с помощью StreamWriter Example: Synchronously write text with StreamWriter

В следующем примере показано, как синхронно записать текст в новый файл с помощью класса StreamWriter по одной строке за раз. The following example shows how to use the StreamWriter class to synchronously write text to a new file one line at a time. Поскольку объект StreamWriter объявляется и создается в инструкции using , вызывается метод Dispose, который автоматически выполняет очистку и закрывает поток. Because the StreamWriter object is declared and instantiated in a using statement, the Dispose method is invoked, which automatically flushes and closes the stream.

Пример Синхронное добавление текста с помощью StreamWriter Example: Synchronously append text with StreamWriter

В следующем примере показано, как использовать класс StreamWriter, чтобы синхронно добавить текст в текстовый файл, созданный в первом примере. The following example shows how to use the StreamWriter class to synchronously append text to the text file created in the first example.

Пример Асинхронная запись текста с помощью StreamWriter Example: Asynchronously write text with StreamWriter

В следующем примере показано, как асинхронно записать текст в новый файл с помощью класса StreamWriter . The following example shows how to asynchronously write text to a new file using the StreamWriter class. Вызов метода WriteAsync должен находиться в методе async . To invoke the WriteAsync method, the method call must be within an async method. Для примера на C# требуется C# 7.1 или более поздней версии, где добавлена поддержка модификатора async для точки входа программы. The C# example requires C# 7.1 or later, which adds support for the async modifier on the program entry point.

Пример Запись и добавление текста с помощью класса File Example: Write and append text with the File class

В следующем примере показано, как записать текст в новый файл и добавить новые строки текста в тот же файл с помощью класса File . The following example shows how to write text to a new file and append new lines of text to the same file using the File class. Методы WriteAllText и AppendAllLines открывают и закрывают файл автоматически. The WriteAllText and AppendAllLines methods open and close the file automatically. Если предоставленный в методе WriteAllText путь уже существует, файл будет перезаписан. If the path you provide to the WriteAllText method already exists, the file is overwritten.

fwrite

Функция fwrite используется для записи структур в бинарный файл. Эта функция определена в библиотеке cstdio, или более старой stdio.h.

Данная функция позволяет записывать любые структуры, главное указать размер таких элементов. Прототип fwrite выглядит так:

  • где ptrvoid — это записываемая структура,
  • size — размер одного элемента такой структуры,
  • count — количество элементов,
  • filestream — файл в который записываются данные.

В данном примере создана пользовательская структура, состоящая из 2 символов. После этого мы открываем файл и записываем массив из 3 структур типа pair. Для этого выделяем при записи место для 3 элементов, каждый из которых занимает в 2 раза больше места, чем символ. Данные записаны, можно закрывать файл.

Ввод данных из файла и вывод в файл

Открытие и закрытие файлов

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

В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
FILE *myfile;

С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения («r»), записи («w») или добавления («a») и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
myfile = fopen («hello.txt», «r»);

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

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

Объявление функции fopen() содержится в заголовочном файле stdio.h, поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE.

После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве параметра ей передается указатель на файл:
fclose(myfile);

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

Чтение из текстового файла и запись в него

fscanf()

Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:
fscanf (myfile, «%s%d», str, &a);

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

Допустим, у нас есть файл содержащий такое описание объектов:

Тогда, чтобы считать эти данные, мы можем написать такую программу:

В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.

fgets()

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

Например:
fgets (str, 50, myfile)

Такой вызов функции прочитает из файла, связанного с указателем myfile, одну строку текста полностью, если ее длина меньше 50 символов с учетом символа ‘\n’, который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ ‘\0’, добавленный fgets() . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет ‘\0’. В таком случае ‘\n’ в считанной строке содержаться не будет.

В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr. Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.

getc() или fgetc()

Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.

Приведенный в качестве примера код выводит данные из файла на экран.

Запись в текстовый файл

Также как и ввод, вывод в файл может быть различным.

  • Форматированный вывод. Функция fprintf ( файловый_указатель, строка_формата, переменные ) .
  • Посточный вывод. Функция fputs ( строка, файловый_указатель ) .
  • Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .

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

Запись в каждую строку файла полей одной структуры:

Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки ‘\n’):

Пример посимвольного вывода:

Чтение из двоичного файла и запись в него

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

При открытии файла для двоичного доступа, вторым параметром функции fopen() является строка «rb» или «wb».

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

Функции fread() и fwrite() принимают в качестве параметров:

  1. адрес области памяти, куда данные записываются или откуда считываются,
  2. размер одного данного какого-либо типа,
  3. количество считываемых данных указанного размера,
  4. файловый указатель.
Илон Маск рекомендует:  Синтаксис CSS

Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно «заказать» считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.

Пример использования функций fread() и fwrite() :

Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.

Бинарные файлы

Бинарные файлы

Т екстовые файлы хранят данные в виде текста (sic!). Это значит, что если, например, мы записываем целое число 12345678 в файл, то записывается 8 символов, а это 8 байт данных, несмотря на то, что число помещается в целый тип. Кроме того, вывод и ввод данных является форматированным, то есть каждый раз, когда мы считываем число из файла или записываем в файл происходит трансформация числа в строку или обратно. Это затратные операции, которых можно избежать.

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

Выполните программу и посмотрите содержимое файла output.bin. Число, которое ввёл пользователь записывается в файл непосредственно в бинарном виде. Можете открыть файл в любом редакторе, поддерживающем представление в шестнадцатеричном виде (Total Commander, Far) и убедиться в этом.

Запись в файл осуществляется с помощью функции

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

Запись в бинарный файл объекта похожа на его отображение: берутся данные из оперативной памяти и пишутся как есть. Для считывания используется функция fread

Функция возвращает число удачно прочитанных элементов, которые помещаются по адресу ptr. Всего считывается count элементов по size байт. Давайте теперь считаем наше число обратно в переменную.

fseek

Одной из важных функций для работы с бинарными файлами является функция fseek

Эта функция устанавливает указатель позиции, ассоциированный с потоком, на новое положение. Индикатор позиции указывает, на каком месте в файле мы остановились. Когда мы открываем файл, позиция равна 0. Каждый раз, записывая байт данных, указатель позиции сдвигается на единицу вперёд.
fseek принимает в качестве аргументов указатель на поток и сдвиг в offset байт относительно origin. origin может принимать три значения

  • SEEK_SET — начало файла
  • SEEK_CUR — текущее положение файла
  • SEEK_END — конец файла. К сожалению, стандартом не определено, что такое конец файла, поэтому полагаться на эту функцию нельзя.

В случае удачной работы функция возвращает 0.

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

Вместо этого можно также использовать функцию rewind, которая перемещает индикатор позиции в начало.

В си определён специальный тип fpos_t, который используется для хранения позиции индикатора позиции в файле.
Функция

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

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

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

Рассмотрим пример: пользователь вводит числа. Первые 4 байта файла: целое, которое обозначает, сколько чисел было введено. После того, как пользователь прекращает вводить числа, мы перемещаемся в начало файла и записываем туда число введённых элементов.

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

Примеры

1. Имеется бинарный файл размером 10*sizeof(int) байт. Пользователь вводит номер ячейки, после чего в неё записывает число. После каждой операции выводятся все числа. Сначала пытаемся открыть файл в режиме чтения и записи. Если это не удаётся, то пробуем создать файл, если удаётся создать файл, то повторяем попытку открыть файл для чтения и записи.

2. Пишем слова в бинарный файл. Формат такой — сначало число букв, потом само слово без нулевого символа. Ели длина слова равна нулю, то больше слов нет. Сначала запрашиваем слова у пользователя, потом считываем обратно.

3. Задача — считать данные из текстового файла и записать их в бинарный. Для решения зачи создадим функцию обёртку. Она будет принимать имя файла, режим доступа, функцию, которую необходимо выполнить, если файл был удачно открыт и аргументы этой функции. Так как аргументов может быть много и они могут быть разного типа, то их можно передавать в качестве указателя на структуру. После выполнения функции файл закрывается. Таким образом, нет необходимости думать об освобождении ресурсов.

4. Функция saveInt32Array позволяет сохранить массив типа int32_t в файл. Обратная ей loadInt32Array считывает массив обратно. Функция loadInt32Array сначала инициализирует переданный ей массив, поэтому мы должны передавать указатель на указатель; кроме того, она записывает считанный размер массива в переданный параметр size, из-за чего он передаётся как указатель.

5. Создание таблицы поиска. Для ускорения работы программы вместо вычисления функции можно произвести сначала вычисление значений функции на интервале с определённой точностью, после чего брать значения уже из таблицы. Программа сначала производит табулирование функции с заданными параметрами и сохраняет его в файл, затем подгружает предвычисленный массив, который уже используется для определения значений. В этой программе все функции возвращают переменную типа Result, которая хранит номер ошибки. Если функция отработала без проблем, то она возвращает Ok (0).

6. У нас имеются две структуры. Первая PersonKey хранит логин, пароль, id пользователя и поле offset. Вторая структура PersonInfo хранит имя и фамилию пользователя и его возраст. Первые структуры записываются в бинарный файл keys.bin, вторые структуры в бинарный файл values.bin. Поле offset определяет положение соответствующей информации о пользователе во втором файле. Таким образом, получив PersonKey из первого файла, по полю offset можно извлечь из второго файла связанную с данным ключом информацию.

Зачем так делать? Это выгодно в том случае, если структура PersonInfo имеет большой размер. Извлекать массив маленьких структур из файла не накладно, а когда нам понадобится большая структура, её можно извлечь по уже известному адресу в файле.

PHP 5 Создание/запись файла

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

PHP создать файл-fopen ()

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

Если вы используете fopen() файл, который не существует, он создаст его, учитывая, что файл открыт для записи (w) или добавления (a).

В приведенном ниже примере создается новый файл с именем «TestFile. txt». Файл будет создан в том же каталоге, где находится PHP-код:

Пример

Разрешения на доступ к файлам PHP

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

PHP запись в файл-fwrite ()

fwrite() функция используется для записи в файл.

Первый параметр fwrite() содержит имя файла для записи, а второй параметр — записываемую строку.

Приведенный ниже пример записывает пару имен в новый файл с именем «NewFile.txt»:

Пример

Обратите внимание, что мы написали в файл «NewFile.txt» дважды. Каждый раз, когда мы писали в файл, мы отправили строку $txt, что первый содержал «John Doe» и второй содержал «Джейн Доу». После того как мы закончили писать, мы закрыли файл с помощью fclose() функции.

Если мы открываем файл «NewFile.txt», он будет выглядеть так:

Перезапись PHP

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

В приведенном ниже примере мы открываем существующий файл «NewFile. txt» и записываем в него новые данные:

Пример

Если мы теперь открываем файл «NewFile. txt», и Джон, и Джейн исчезли, и только данные, которые мы только что написали присутствует:

Полная ссылка на файловую систему PHP

Для полной ссылки на функции файловой системы, перейдите на наш полный Ссылка на файловую систему PHP.

file_put_contents

file_put_contents — Пишет данные в файл

Описание

Функция идентична последовательным успешным вызовам функций fopen() , fwrite() и fclose() .

Если filename не существует, файл будет создан. Иначе, существующий файл будет перезаписан, за исключением случая, если указан флаг FILE_APPEND .

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

Путь к записываемому файлу.

Записываемые данные. Может быть типа string , array или ресурсом потока.

Если data является потоковым ресурсом ( stream ), оставшийся буфер этого потока будет скопирован в указанный файл. Это похоже на использование функции stream_copy_to_stream() .

Также вы можете передать одномерный массив в качестве параметра data . Это будет эквивалентно вызову file_put_contents($filename, implode(», $array)).

Значением параметра flags может быть любая комбинация следующих флагов, соединенных бинарным оператором ИЛИ (|).

Доступные флаги

Флаг Описание
FILE_USE_INCLUDE_PATH Ищет filename в подключаемых директориях. Подробнее смотрите директиву include_path.
FILE_APPEND Если файл filename уже существует, данные будут дописаны в конец файла вместо того, чтобы его перезаписать.
LOCK_EX Получить эксклюзивную блокировку на файл на время записи. Другими словами, между вызовами fopen() и fwrite() произойдет вызов функции flock() . Это не одно и то же, что вызов fopen() с флагом «x».

Корректный ресурс контекста, созданный с помощью функции stream_context_create() .

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

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

Эта функция может возвращать как логическое значение FALSE , так и значение не типа boolean, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Примеры

Пример #1 Пример простого использования

Пример #2 Использование флагов

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

Версия Описание
5.1.0 Добавлена поддержка LOCK_EX и возможность передачи потокового ресурса в параметр data

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

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

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

  • fopen() — Открывает файл или URL
  • fwrite() — Бинарно-безопасная запись в файл
  • file_get_contents() — Читает содержимое файла в строку
  • stream_context_create() — Создаёт контекст потока

User Contributed Notes 35 notes

File put contents fails if you try to put a file in a directory that doesn’t exist. This creates the directory.

function file_force_contents ( $dir , $contents ) <
$parts = explode ( ‘/’ , $dir );
$file = array_pop ( $parts );
$dir = » ;
foreach( $parts as $part )
if(! is_dir ( $dir .= «/ $part » )) mkdir ( $dir );
file_put_contents ( » $dir / $file » , $contents );
>
?>

function file_force_contents ( $fullPath , $contents , $flags = 0 ) <
$parts = explode ( ‘/’ , $fullPath );
array_pop ( $parts );
$dir = implode ( ‘/’ , $parts );

if( ! is_dir ( $dir ) )
mkdir ( $dir , 0777 , true );

file_put_contents ( $fullPath , $contents , $flags );
>

file_force_contents ( ROOT . ‘/newpath/file.txt’ , ‘message’ , LOCK_EX );
?>

It should be obvious that this should only be used if you’re making one write, if you are writing multiple times to the same file you should handle it yourself with fopen and fwrite, the fclose when you are done writing.

file_put_contents() for 1,000,000 writes — average of 3 benchmarks:

real 0m3.932s
user 0m2.487s
sys 0m1.437s

fopen() fwrite() for 1,000,000 writes, fclose() — average of 3 benchmarks:

real 0m2.265s
user 0m1.819s
sys 0m0.445s

Please note that when saving using an FTP host, an additional stream context must be passed through telling PHP to overwrite the file.

/* set the FTP hostname */
$user = «test» ;
$pass = «myFTP» ;
$host = «example.com» ;
$file = «test.txt» ;
$hostname = $user . «:» . $pass . «@» . $host . «/» . $file ;

/* the file content */
$content = «this is just a test.» ;

/* create a stream context telling PHP to overwrite the file */
$options = array( ‘ftp’ => array( ‘overwrite’ => true ));
$stream = stream_context_create ( $options );

/* and finally, put the contents */
file_put_contents ( $hostname , $content , 0 , $stream );
?>

It’s worth noting that you must make sure to use the correct path when working with this function. I was using it to help with logging in an error handler and sometimes it would work — while other times it wouldn’t. In the end it was because sometimes it was called from different paths resulting in a failure to write to the log file.

__DIR__ is your friend.

It’s important to understand that LOCK_EX will not prevent reading the file unless you also explicitly acquire a read lock (shared locked) with the PHP ‘flock’ function.

i.e. in concurrent scenarios file_get_contents may return empty if you don’t wrap it like this:

= fopen ( ‘test.txt’ , ‘rt’ );
flock ( $myfile , LOCK_SH );
$read = file_get_contents ( ‘test.txt’ );
fclose ( $myfile );
?>

If you have code that does a file_get_contents on a file, changes the string, then re-saves using file_put_contents, you better be sure to do this correctly or your file will randomly wipe itself out.

Make sure not to corrupt anything in case of failure.

function file_put_contents_atomically ( $filename , $data , $flags = 0 , $context = null ) <
if ( file_put_contents ( $filename . «

» , $data , $flags , $context ) === strlen ( $contents )) <
return rename ( $filename . «

» , $context );
return FALSE ;
>

This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

File put contents fails if you try to put a file in a directory that doesn’t exist. This function creates the directory.

i have updated code of «TrentTompkins at gmail dot com». thanks
/**
* @param string $filename

file name including folder.
* example :: /path/to/file/filename.ext or filename.ext

* @param string $data

The data to write.
*

* @param int $flags same flags used for file_put_contents.
* more info: http://php.net/manual/en/function.file-put-contents.php
* @return bool TRUE file created succesfully
FALSE failed to create file.
*/
function file_force_contents ( $filename , $data , $flags = 0 ) <
if(! is_dir ( dirname ( $filename )))
mkdir ( dirname ( $filename ). ‘/’ , 0777 , TRUE );
return file_put_contents ( $filename , $data , $flags );
>
// usage

file_force_contents ( ‘test1.txt’ , ‘test1 content’ ); // test1.txt created

file_force_contents ( ‘test2/test2.txt’ , ‘test2 content’ );
// test2/test2.txt created «test2» folder.

/test3/test3.txt’ , ‘test3 content’ );
// /path/to/user/directory/test3/test3.txt created «test3» folder in user directory (check on linux «ll

I’m updating a function that was posted, as it would fail if there was no directory. It also returns the final value so you can determine if the actual file was written.

public static function file_force_contents($dir, $contents) <
$parts = explode(‘/’, $dir);
$file = array_pop($parts);
$dir = »;

foreach($parts as $part) <
if (! is_dir($dir .= «<$part>/»)) mkdir($dir);
>

return file_put_contents(«<$dir><$file>«, $contents);
>

In reply to the previous note:

If you want to emulate this function in PHP4, you need to return the bytes written as well as support for arrays, flags.

I can only figure out the FILE_APPEND flag and array support. If I could figure out «resource context» and the other flags, I would include those too.

This should also handle $filename from other than root and also $filename without path.

function file_force_contents($filename, $data, $per = 0755, $flags = 0) <
$fn = «»;
if(substr($filename, 0, 1) === «/») $fn .= «/»;
$parts = explode(«/», $filename);
$file = array_pop($parts);

foreach($parts as $part) <
if(!is_dir($fn .= «$part»)) mkdir($fn, $per, true);
$fn .= «/»;
>

file_put_contents($fn.$file, $data, $flags);
>

To upload file from your localhost to any FTP server.
pease note ‘ftp_chdir’ has been used instead of putting direct remote file path. in ftp_put . remoth file should be only file name

= ‘*****’ ;
$usr = ‘*****’ ;
$pwd = ‘**********’ ;
$local_file = ‘./orderXML/order200.xml’ ;
$ftp_path = ‘order200.xml’ ;
$conn_id = ftp_connect ( $host , 21 ) or die ( «Cannot connect to host» );
ftp_pasv ( $resource , true );
ftp_login ( $conn_id , $usr , $pwd ) or die( «Cannot login» );
// perform file upload
ftp_chdir ( $conn_id , ‘/public_html/abc/’ );
$upload = ftp_put ( $conn_id , $ftp_path , $local_file , FTP_ASCII );
if( $upload ) < $ftpsucc = 1 ; >else < $ftpsucc = 0 ; >
// check upload status:
print (! $upload ) ? ‘Cannot upload’ : ‘Upload complete’ ;
print «\n» ;
// close the FTP stream
ftp_close ( $conn_id );
?>

I use file_put_contents() as a method of very simple hit counters. These are two different examples of extremely simple hit counters, put on one line of code, each.

Keep in mind that they’re not all that efficient. You must have a file called counter.txt with the initial value of 0.

For a text hit counter:
= file_get_contents ( «counter.txt» ); $counter ++; file_put_contents ( «counter.txt» , $counter ); echo $counter ;
?>

Or a graphic hit counter:
= file_get_contents ( «counter.txt» ); $counter ++; file_put_contents ( «counter.txt» , $counter ); for( $i = 0 ; $i strlen ( $counter ); $i ++) echo » . substr ( $counter , $i , 1 ). «.gif\» alt=\»» . substr ( $counter , $i , 1 ). «\» />» ;
?>

I faced the problem of converting a downloaded csv file that had Windows-1252 encoding, so to convert it to UTF-8 this worked for me:

$from = ‘Windows-1252’;
$to = ‘UTF-8’;

file_put_contents($this->path(), mb_convert_encoding($content, $to, $from));

where «$this->path()» has the path of the file. Using this the file is converted from Windows-1252 to UTF-8.

With this you can import it with mysqlimport with no problems.

Here is a stupid pitfall I just fell into.
I think it may happen rather frequently, so I report it.

A common situation is that the $filename argument is built from two variables:
file_put_contents($path . $file, $content);

Say that $path = ‘path/to’ and $file = ‘file.txt’: you see that $path lacks its ending «/», so the resulting full path is ‘path/tofile.txt’.

Then you look at ‘path/to’ and don’t see any ‘file.txt’, although no warning or notice was thrown!
And may be (like for me :D) it’ll take time before you realize that a bad ‘tofile.txt’ was created in the *parent* directory of the one where you were looking for your file.

As to the previous user note, it would be wise to include that code within a conditional statement, as to prevent re-defining file_put_contents and the FILE_APPEND constant in PHP 5:

if ( ! function_exists ( ‘file_put_contents’ ) && ! defined ( ‘FILE_APPEND’ ) ) <
.
>
?>

Also, if the file could not be accessed for writing, the function should return boolean false, not 0. An error is different from 0 bytes written, in this case.

I suggest to expand file_force_contents() function of TrentTompkins at gmail dot com by adding verification if patch is like: «../foo/bar/file»

if (strpos($dir, «../») === 0)
$dir = str_replace(«..», substr(__DIR__, 0, strrpos(__DIR__, «/»)), $dir);

I made ​​a ftp_put_contents function.

function ftp_put_contents ( $fpc_path_and_name , $fpc_content ) <

//Temporary folder in the server
$cfg_temp_folder = str_replace ( «//» , «/» , $_SERVER [ ‘DOCUMENT_ROOT’ ]. «/_temp/» );

//FTP username
$cfg_user = «user» ;

//FTP password
$cfg_pass = «password» ;

//Document Root of FTP
$cfg_document_root = «DOCUMENT ROOT OF FTP» ;

//Link to the website
$cfg_site_link = «Link to the website» ;

//Check if conteins slash on the path of the file
$cotains_slash = strstr ( $fpc_path_and_name , «/» );

//Get filename and paths
if ( $cotains_slash ) <
$fpc_path_and_name_array = explode ( «/» , $fpc_path_and_name );
$fpc_file_name = end ( $fpc_path_and_name_array );
>
else <
$fpc_file_name = $fpc_path_and_name ;
>

//Create local temp dir
if (! file_exists ( $cfg_temp_folder )) <
if (! mkdir ( $cfg_temp_folder , 0777 )) <
echo «Unable to generate a temporary folder on the local server — $cfg_temp_folder .
» ;
die();
>
>

//Create local file in temp dir
if (! file_put_contents ( str_replace ( «//» , «/» , $cfg_temp_folder . $fpc_file_name ), $fpc_content )) <
echo «Unable to generate the file in the temporary location — » . str_replace ( «//» , «/» , $cfg_temp_folder . $fpc_file_name ). «.
» ;
die();
>

//Connection to the FTP Server
$fpc_ftp_conn = ftp_connect ( » $cfg_ftp_server » );

//Check connection
if (! $fpc_ftp_conn ) <
echo «Could not connect to server $cfg_ftp_server .
» ;
die();
>
else <

// login
// check username and password
if (! ftp_login ( $fpc_ftp_conn , » $cfg_user » , » $cfg_pass » )) <
echo «User or password.
» ;
die();
>
else <

//Document Root
if (! ftp_chdir ( $fpc_ftp_conn , $cfg_document_root )) <
echo «Error to set Document Root.
» ;
die();
>

//Check if there are folders to create
if ( $cotains_slash ) <

//Check if have folders and is not just the file name
if ( count ( $fpc_path_and_name_array ) > 1 ) <

//Remove last array
$fpc_remove_last_array = array_pop ( $fpc_path_and_name_array );

//Checks if there slashs on the path
if ( substr ( $fpc_path_and_name , 0 , 1 ) == «/» ) <
$fpc_remove_first_array = array_shift ( $fpc_path_and_name_array );
>

//Create each folder on ftp
foreach ( $fpc_path_and_name_array as $fpc_ftp_path ) <
if (!@ ftp_chdir ( $fpc_ftp_conn , $fpc_ftp_path )) <
if (! ftp_mkdir ( $fpc_ftp_conn , $fpc_ftp_path )) <
echo «Error creating directory $fpc_ftp_path .
» ;
>
else <
if (! ftp_chdir ( $fpc_ftp_conn , $fpc_ftp_path )) <
echo «Error go to the directory $fpc_ftp_path .
» ;
>
>
>
>
>
else <

//Check upload file
if (! ftp_put ( $fpc_ftp_conn , $fpc_file_name , str_replace ( «//» , «/» , $cfg_temp_folder . $fpc_file_name ), FTP_ASCII )) <
echo «File upload $fpc_path_and_name failed!
» ;
die();
>
else <
if (! unlink ( str_replace ( «//» , «/» , $cfg_temp_folder . $fpc_file_name ))) <
echo «Error deleting temporary file.
» ;
die();
>
else <
echo «File upload $cfg_site_link » . str_replace ( «//» , «/» , «/ $fpc_path_and_name » ). «‘> $cfg_site_link » . str_replace ( «//» , «/» , «/ $fpc_path_and_name » ). « successfully performed.
» ;
>
>

//Close connection to FTP server
ftp_close ( $fpc_ftp_conn );
>
>
>

PHP-функция fwrite()

PHP fwrite() используется для записи строки в открытый файловый поток handle в бинарно-безопасном формате. Поэтому можно использовать эту функцию для записи в открытый файл.

Пример применения функции fwrite() :

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

Функция возвращает количество записанных байтов или значение FALSE ( в случае ошибки ).

Дополнительная информация

Действие функции завершается в конце файла или при достижении определённой длины.

Версии и история изменений PHP

Функция fwrite() доступна в версиях PHP 4 , 5 и 7 .

Связанные функции

Связанные с fwrite PHP функции , о которых следует знать:

fread() — производит бинарно-безопасное чтение файла;
fopen() — открывает файл или URL ;
fsockopen() — открывает соединение с сокетом или доменным сокетом Unix ;
popen() — открывает файловый указатель процесса;
file_get_contents() — считывает файл в строку;
pack() — упаковывает данные в бинарную строку.

Параметры

handle

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

string

Параметр string используется для указания записываемой строки. Это обязательный параметр.

length

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

fwrite PHP пример:

Дополнительные советы

Функция возвращает значение FALSE только в том случае, если вы ввели неверные аргументы. При любой другой ошибке возвратное значение меньше strlen ( $string ), которым в большинстве случаев является 0 . Зацикливание повторных вызовов функции fwrite() будет происходить до тех пор, пока не будет достигнуто нужное число записываемых байт или ожидание возврата значения FALSE при разорванном соединении приведут к бесконечному циклу. Вы должны проверить возвратное значение fwrite PHP и либо немедленно отменить операцию, либо указать максимальное количество повторных попыток.

Ниже приведён пример из документации. Это плохой код, так как broken pipe приведет к бесконечному зацикливанию функции fwrite() с возвратным значением 0 . Цикл прерывается только при возврате функцией fwrite() значения false или успешной записи всех байт. В случае возникновения ошибки вы получите бесконечный цикл.

Данная публикация представляет собой перевод статьи « PHP fwrite() Function » , подготовленной дружной командой проекта Интернет-технологии.ру

fwrite

Для iPhone игры я пишу я написал PHP скрипт, который петлями через файл CSV 50000 слов и записывает количество результатов…

Кажется, существует много путаницы относительно назначения двух аргументов ‘size’ и ‘count’ в fwrite(). Я пытаюсь выяснить, что будет быстрее -…

Я пишу буфер без знака char в файл (c++): FILE* f = fopen(«out.data»,»wb»); size_t count = fwrite((const void *)pBuf, sizeof(unsigned…

Я хочу выпустить всплывающее окно или что-то, чтобы напомнить пользователям выполнить второе действие после первого действия. Первое действие fwrite($fp, $str);…

Я собрал часть кода, возможно, он мог бы быть написан лучше — но он работает, и я научился не быть…

Я ищу, чтобы написать пользовательские nginxдирективы динамически из PHP. Однако меня беспокоит безопасность. PHP работает под пользователем / группойphp:php, и…

Наличие проблемы чтения / записи через PHP file_get_contents / file_put_contents. В основном я хочу прочитать текстовый файл в textarea (нажмите…

Если я fwrite’ w ‘ файл на сервере Windows с ntfs loggong (как мой локальный сервер xampp), эффективно перезаписать его…

Я хочу держать ips от посетителей и помещать их в файл. Я попытался fwrite () функцию, но я думаю, что…

У меня проблема с моим кодом Этот скрипт записывает переменную в csv-файл. I m получение корыта параметров через HTTP GET,…

У меня есть базовый PHP скрипт, который будет писать / войти в текстовый документ

Я просто играю с действием формы и php. I’m not good at them, just starting to learn and recently I…

Я пишу некоторые файлы в файловой системе, но к сожалению эти файлы удаляются при выходе PHP скрипта. Я пытался создать…

Можно ли создать несуществующий каталог в Java, используя только класс URL или класс URLConnection? Обычно я использую что-то вроде new…

Ниже показано, как я пишу данные с символом юникода в корневой папке

Codeblockss, C. Я пытаюсь написать символы .txt, используя fwrite. Первые несколько символов пишутся правильно, но после них файл говорит: _mcleanup:…

У меня есть редактор на моем сайте, который будет сохранять изображения в этом формате автоматически:

У меня есть страница php, которая создает файлы txt с использованием fwrite, которые затем загружаются в каталог на сервере. У…

У меня вызвана функцияlogToFile, и когда я ее вызываю, она записывает в файл, но не добавляет новую строку. Это мой…

Я разрабатываю приложение, где пользователь загружает excel [.xlsx] файл для сброса данных в базу данных MySQL. Я запрограммировал таким образом,…

импорт организации.апаш.log4j.BasicConfigurator; импорт организации.апаш.log4j.Лесопогрузчик; класс My >

мой вопрос связан с тем, чтобы поместить XML-данные в определенные файлы, которые были созданы с помощью PHP. Скажем, это был…

Я хотел бы задать вам вопрос относительно моей простой программы. У меня есть 6 текстовых полей (a,b,c,a1,b1, c1). Если мои…

$abc = @fopen(«$DOCUMENT_ROOT/../public_html/zamowienia.txt»,’ab’); if(!$abc) < echo «

Zamowienie Panstwa nie moze zostac przyjete w tej chwili. Prosze sprobowac pozniej.»;…

как бы я получил выше, чтобы написать? ive был в состоянии написать каждый пост, делая их по одному, но нет…

У меня есть’ экспорт ‘ пользовательский скрипт, который выводит кучу диаграмм highcharts в различных форматах, в том числе .xls .png…

Пишу программу для radix sort some numbers которая находится в файле. вот мой код: rsort(a): if a: bins = […

Привет я запускаю программу для разбора таблицы из HTML-адреса. Все это прекрасно работает, и я могу печатать данные, которые я…

У меня есть двоичное число, которое имеет 64 бита. Но я хочу напечатать его в этом порядке: Первая строка: 52…

Я пытаюсь создать код, который позволит мне сохранить csv-файл, созданный на странице php, но вместо того, чтобы открывать его (как…

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

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

Fread не читает, когда структура объявляется в разделе кучи? Я могу писать в файл, но когда я пытаюсь прочитать файл,…

Я пытался решить эту проблему около 1,5 часов, но не смог заставить ее работать. Я также искал в Google. Валидатор…

У меня есть проблема с некоторыми fwrite, которые терпят неудачу в пути, который я не понимаю. В этом фрагменте кода…

Я хочу использовать fwrite для сохранения данных в a .txt-файл. Метод action, кажется, работает, так как он может показывать HTML-теги…

Во-первых, я очень очень очень плохо с php так что извините за этот вопрос У меня есть приложение, в котором…

У меня есть небольшая программа для форума, которая смотрит в поток и сохраняет дату последнего поста каждого пользователя в базу…

Я пытаюсь преобразовать строки и целые числа в двоичные с помощью fscanf и fwrite, чтобы записать их в выходной файл….

Я пытаюсь использовать cURL для загрузки внешнего файла образа. При использовании из командной строки cURL правильно указывает заголовки ответов with…

Теперь я делаю чтение входных данных из txt-файла и записываю результаты в txt-файл. Однако результаты, выполняемые в симуляции, хорошо работают,…

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

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

Я использую это много, и я чувствую, что я делаю это неправильно. в ng-repeat я хочу показать некоторую часть, если…

У меня есть данные xml, которые отправляются в виде строки в url. Например url?data=строка Это отправляется на другой сервер, над…

Сейчас я сыт по горло этой проблемой, пытаюсь ее исправить уже 2-3 дня. Проблема: Я загружаю определенные изображения, а затем…

Я на первом курсе программирования, учусь на высшем уровне. У меня был хороший поиск вашего сайта и google для чего-нибудь…

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

У меня есть двоичные логические данные, которые я хочу сохранить в файл с наименьшим количеством места. Когда я проверяю размер…

Я делаю внешнюю сортировку слияния для задания, и мне дают две структуры: // This is the definition of a record…

fread() и fwrite()

Файловая система ANSI С предоставляет две функции, позволяющие читать и писать блоки дан¬ных — fread() и fwrite(). Они имеют следующие прототипы:

size_t fread(void *буфер, size_t число_байту size_t объем, FILE *fp);

size_t fwrite(const void *буфер, size_t число_байт, size_t объем, FILE *fp);

В случае fread() буфер — это указатель на область памяти, которая получает данные из файла. В случае fwrite() буфер — это указатель на информацию, записываемую в файл. Длина каждого элемента в байтах определяется в число_байт. Аргумент объем определяет, сколько элементов (каж¬дый длиной число_байт) будет прочитано или записано. Наконец, fp — это файловый указатель на ранее открытый поток.

Функция fread() возвращает число прочитанных элементов. Данное значение может быть мень¬ше, чем объем, если был достигнут конец файла или произошла ошибка. Функция fwrite() возвра¬щает число записанных элементов. Данное значение равно объем, если не возникла ошибка.

Если файл был открыт для двоичных данных, то fread() и fwrite() могут читать и писать любой тип информации. Например, следующая программа записывает float в файл:

/* запись вещественных чисел в файл */
#include
int main(void)
<
FILE *fp;
float f = 12.23;
if((fp=fopen(«test», «wb»))==NULL) <
printf(«Cannot open file.»);
return 1;
>
fwrite(&f, sizeof (float), 1, fp);
fclose (fp);
return 0;
>

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

Одно из наиболее полезных применений fread() и fwrite() — это чтение и запись блоков данных типа массивов или структур. Например, следующий фрагмент записывает содержимое массива ве¬щественных чисел balance в файл balance, используя один оператор fwrite(). Далее она читает мас¬сив, используя один оператор fread(), и выводит его содержимое.

#include
int main(void)
<
register int i;
FILE *fp;
float balance[100];

/* открытие на запись */
if((fp=fopen(«balance», «wb»))==NULL) <
printf(«Cannot open file.»);
return 1;
>
for(i=0; i

Возникли проблемы с fread и fwrite при записи некоторых символов и структуры в файл и их чтении

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

Вместо этого результата:

Я получаю этот результат:

Я не знаю, что я делаю не так. Я записываю байты в файл, читаю их обратно и отображаю на экране. Что идет не так?

Решение

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

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

Вы используете fwrite ошибочно. Идет fwrite(pointer to data, size of each data, number of data, FILE pointer); ,

Вы используете fseek ошибочно. Я вижу, ты запутался с offset параметр. Это смещение определяет обозначенное расстояние от origin указано в качестве последнего аргумента fseek , Поэтому, если вы в SEEK_END , вы должны двигаться назад, имея offset быть отрицательным числом.

Я сделал эти изменения сам, и теперь это работает. Выход: q 123 2111 e

Вот милый маленький Веб-сайт для тебя тоже. Помог мне с твоей проблемой.

Спасибо за чтение.

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

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

Настоящая проблема в том, что вы делаете со всеми fseek :
до первого fread Вы делаете fseek за пределами
файл. Любое чтение с этой позиции гарантированно потерпит неудачу.
Вы действительно должны проверить состояние файла и убедиться, что
fread успешно, прежде чем получить доступ к любому из значений, которые вы
читать. Если это не удалось, доступ к переменным (по крайней мере, те, в
stuff ) неопределенное поведение; скорее всего, вы получите
случайный мусор.

Ты первый fseek должно быть в начале файла, или
еще:

Если вы только что прочитали структуру, то второй fseek является
также не нужно. (В вашем случае это означает, что окончательный
‘e’ правильно читать.)

Вы должны открыть свой файл в двоичном режиме, чтобы это работало.

Ваш желаемый результат также немного неясен, если он не начинается с трех символов ‘z’ , ‘s’ а также ‘q’ , а то есть целые числа? Обратите внимание, что целые числа могут появиться с заменой байтов, если вы находитесь на машине с прямым порядком байтов.

Чтобы помочь отладить код, вы должны добавить проверку возвращаемого значения ко всем вызовам ввода / вывода, поскольку ввод / вывод может завершиться неудачей. Также обратите внимание, что sizeof (char) всегда 1 так что не очень полезно так писать.

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