fwrite — Бинарно-безопасная запись в файл

Функции fread() и fwrite()

Для чтения и записи данных, тип которых может занимать более 1 байта, в файловой системе языка С имеется две функции: fread() и fwrite() . Эти функции позволяют читать и записывать блоки данных любого типа. Их прототипы следующие:

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

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

Использование fread() и fwrite()

Как только файл открыт для работы с двоичными данными, fread() и fwrite() соответственно могут читать и записывать информацию любого типа. Например, следующая программа записывает в дисковый файл данные типов double , int и long , a затем читает эти данные из того же файла. Обратите внимание, как в этой программе при определении длины каждого типа данных используется функция sizeof() .

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

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

то следующий оператор записывает содержимое cust в файл, на который указывает fp :

Пример со списком рассылки

Чтобы показать, как можно легко записывать большие объемы данных, пользуясь функциями fread() и fwrite() , мы переделаем программу работы со списком рассылки, с которой впервые встретились в главе 7. Усовершенствованная версия сможет сохранять адреса в файле. Как и раньше, адреса будут храниться в массиве структур следующего типа:

Значение MAX определяет максимальное количество адресов, которое может быть в списке.

При выполнении программы поле name каждой структуры инициализируется пустым указателем ( NULL ). В программе свободной считается та структура, поле name которой содержит строку нулевой длины, т.е. имя адресата представляет собой пустую строку.

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

Обе функции, save() и load() , подтверждают (или не подтверждают) успешность выполнения функциями fread() и fwrite() операций с файлом, проверяя значения, возвращаемые функциями fread() и fwrite() . Кроме того, функция load() явно проверяет, не достигнут ли конец файла. Делает она это с помощью вызова функции feof() . Это приходится делать потому, что fread() и в случае ошибки, и при достижении конца файла возвращает одно и то же значение.

Fwrite — Бинарно-безопасная запись в файл

(PHP 3, PHP 4, PHP 5)

fwrite — Бинарно-безопасная запись в файл

Описание int fwrite ( resource handle, string string [, int length] )

fwrite() записывает содержимое string в файловый поток handle . Если передан аргумент length , запись остановится после того, как length байтов будут записаны или будет достигнут конец строки string , смотря что произойдёт первым.

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

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

Пример 1. Простой пример использования fwrite

// Вначале давайте убедимся, что файл существует и доступен для записи.
if ( is_writable ( $filename )) <

// В нашем примере мы открываем $filename в режиме «дописать в конец».
// Таким образом, смещение установлено в конец файла и
// наш $somecontent допишется в конец при использовании fwrite().
if (! $handle = fopen ( $filename , ‘a’ )) <
echo «Не могу открыть файл ($filename)» ;
exit;
>

// Записываем $somecontent в наш открытый файл.
if ( fwrite ( $handle , $somecontent ) === FALSE ) <
echo «Не могу произвести запись в файл ($filename)» ;
exit;
>

echo «Ура! Записали ($somecontent) в файл ($filename)» ;

> else <
echo «Файл $filename недоступен для записи» ;
>
?>

Пред. Начало След.
ftruncate Уровень выше glob

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

PHP — Запись и чтение бинарных файлов

Для записи и чтения бинарных файлов в PHP есть две функции pack() и unpack() . Более подробно они писаны на оф. сайте:

Пример записи и чтения массива

Далее пример записи массива в бинарный файл и чтение из него:

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

Чтение данных MP3 файла (ID3 тегов)

Также с помощью pack() и unpack() можно получать информацию с различных других бинарных файлов, например MP3 ID3 теги:

Результатом работы этого скрипта будет массив следующего вида:

Естественно при реальной работе скрипта вместо Track * будут данные того MP3 файла, который был считан.

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

fwrite

fwrite — Бинарно-безопасная запись в файл

Описание

fwrite() записывает содержимое string в файловый поток handle .

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

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

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

Учтите, что если указан аргумент length , то директива magic_quotes_runtime будет проигнорирована и строка string не будет очищена от слэшей.

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

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

Примечания

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

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

Если дескриптор handle был открыт функцией fopen() в режиме «записи в конец», то вызовы fwrite() будут атомарными (за исключением случая, если string размер блока файловой системы, на некоторых платформах, и пока файл хранится на локальной файловой системе). Т.е. нет необходимости блокировать ресурс с помощью flock() перед вызовом fwrite() — все данные будут записаны без прерываний.

При повторной записи в файловый указатель данные будут добавлены в конец содержимого файла:

= fopen ( ‘data.txt’ , ‘w’ );
fwrite ( $fp , ‘1’ );
fwrite ( $fp , ’23’ );
fclose ( $fp );

// содержимое ‘data.txt’ теперь 123, а не 23!
?>

Примеры

Пример #1 Простой пример использования fwrite()

= ‘test.txt’ ;
$somecontent = «Добавить это к файлу\n» ;

// Вначале давайте убедимся, что файл существует и доступен для записи.
if ( is_writable ( $filename )) <

// В нашем примере мы открываем $filename в режиме «записи в конец».
// Таким образом, смещение установлено в конец файла и
// наш $somecontent допишется в конец при использовании fwrite().
if (! $handle = fopen ( $filename , ‘a’ )) <
echo «Не могу открыть файл ( $filename )» ;
exit;
>

// Записываем $somecontent в наш открытый файл.
if ( fwrite ( $handle , $somecontent ) === FALSE ) <
echo «Не могу произвести запись в файл ( $filename )» ;
exit;
>

echo «Ура! Записали ( $somecontent ) в файл ( $filename )» ;

> else <
echo «Файл $filename недоступен для записи» ;
>
?>

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

  • fread() — Бинарно-безопасное чтение файла
  • fopen() — Открывает файл или URL
  • fsockopen() — Открывет соединение с интернет сокетом или доменным сокетом Unix
  • popen() — Открывает файловый указатель процесса
  • file_get_contents() — Читает содержимое файла в строку

Коментарии

Don’t forget to check fwrite returns for errors! Just because you successfully opened a file for write, doesn’t always mean you can write to it.

On some systems this can occur if the filesystem is full, you can still open the file and create the filesystem inode, but the fwrite will fail, resulting in a zero byte file.

Use caution when using:

$content = fread($fh, filesize($fh)) or die «Error Reading»;

This will cause an error if the file you are reading is zero length.

if ( false === fread($fh, filesize($fh)) ) die «Error Reading»;

Thus it will be successful on reading zero bytes but detect and error returned as FALSE.

the fwrite output striped the slashes if without length argument given, example:

= «c:\\01.txt» ;
$out = fopen ( «out.txt» , «w» );
fwrite ( $out , $str );
fclose ( $out );
?>

Илон Маск рекомендует:  Opengl лекция №1 введение события сообщения контекст

the out.txt will be:
c:^@1.txt
the ‘\\0’ without escape will be ‘\0’ ==> 0x00.

the correct one is change fwrite to:
fwrite($out, $str, strlen($str));

[Ed. Note:
The runtime configuration setting auto_detect_line_endings should solve this problem when set to On.]

I figured out problems when writing to a file using \r as linebreak, after that file() wasn’t able to read the data from that file.
Using \n solved the problem.

Hope this helps other newbies.

If you are writing data to a txt file on a windows system and need a line break. use \r\n . This will write hex OD OA.

i.e.
$batch_data= «some data. \r\n»;
fwrite($fbatch,$batch_data);

The is the equivalent of opening a txt file in notepad pressing enter and the end of the line and saving it.

In PHP 4.3.7 fwrite returns 0 rather than false on failure.
The following example will output «SUCCESS: 0 bytes written» for existing file test.txt:

$fp = fopen(«test.txt», «rw»);
if (($bytes_written = fwrite($fp, «This is a test»)) === false) <
echo «Unable to write to test.txt\n\n»;
> else <
echo «SUCCESS: $bytes_written bytes written\n\n»;
>

Watch out for mistakes in writting a simple code for a hit counter:
= fopen ( ‘cont.txt’ , ‘r’ );
$incr = fgets ( $cont );
//echo $incr;
$incr ++;
fclose ( $cont );
$cont = fopen ( ‘cont.txt’ , ‘a’ );
fwrite ( $cont , $incr );
fclose ( $cont );
?>

Why? notice the second fopen -> $cont=fopen(‘cont.txt’,’a’);
it opens the file in writting mode (a). And when it ads the incremented
value ( $incr ) it ads it ALONG the old value. so opening the counter
page about 5 times will make your hits number look like this
012131214121312151.21312141213E+ . you get the piont.
nasty, isn’t it? REMEMBER to open the file with the ‘w’ mode (truncate
the file to 0). Doing this will clear the file content and it will make sure that
your counter works nice. This is the final code

= fopen ( ‘cont.txt’ , ‘r’ );
$incr = fgets ( $cont );
//echo $incr;
$incr ++;
fclose ( $cont );
$cont = fopen ( ‘cont.txt’ , ‘w’ );
fwrite ( $cont , $incr );
fclose ( $cont );
?>

Notice that this work fine =)
XU (alias Iscu Andrei)

I needed to append, but I needed to write on the file’s beginning, and after some hours of effort this worked for me:

$file = «file.txt»;
if (!file_exists(«file.txt»)) touch(«file.txt»);
$fh = fopen(«file.txt», «r»);
$fcontent = fread($fh, filesize(«file.txt»));

$towrite = «$newcontent $fcontent»;

$fh22 = fopen(‘file.txt’, ‘w+’);
fwrite($fh2, $towrite);
fclose($fh);
fclose($fh2);

if you want to create quickly and without fopen use system, exec

system(‘echo «blahblah» > /path/file’);

Using fwrite to write to a file in your include folder.

PHP does not recognise the permissions setting for the file until you restart the server. this script works fine. (still have to create the blank text file first though. it is not created automatically) On OS X Server..
Using the 1 in fopen tells php to look for the file in your include folder. Change your include folder by altering include_path in php.ini
On OS X Server, php.ini is in private/etc/php.ini.default
copy the file and call it php.ini

the default include path is usr/lib/php
(All these folders are hidden — use TinkerTool to reveal them)

= fopen ( ‘textfile.txt’ , ‘a’ , 1 );
$text = «\n Your text to write \n » . date ( ‘d’ ). «-» . date ( ‘m’ ). «-» . date ( ‘Y’ ). «\n\n» ;
fwrite ( $file , $text );
fclose ( $file );
?>

I could’nt quite get MKP Dev hit counter to work. this is how I modified it
function hitcount ()
<
$file = «counter.txt» ;
if ( ! file_exists ( $file )) <
touch ( $file );
$handle = fopen ( $file , ‘r+’ ); // Let’s open for read and write
$count = 0 ;

>
else <
$handle = fopen ( $file , ‘r+’ ); // Let’s open for read and write
$count = fread ( $handle , filesize ( $file ));
settype ( $count , «integer» );
>
rewind ( $handle ); // Go back to the beginning
/*
* Note that we don’t have problems with 9 being fewer characters than
* 10 because we are always incrementing, so we will always write at
* least as many characters as we read
**/
fwrite ( $handle , ++ $count ); // Don’t forget to increment the counter
fclose ( $handle ); // Done

Use this to get a UTF-8 Unicode CSV file that opens properly in Excel:

$tmp = chr(255).chr(254).mb_convert_encoding( $tmp, ‘UTF-16LE’, ‘UTF-8’);
$write = fwrite( $filepath, $tmp );

Use a tab character, not comma, to seperate the fields in the $tmp.

Credit for this goes to someone called Eugene Murai, I found this solution by him after searching for several hours.

For those who, like me, lost a lot of minutes (hours) to understand why fwrite doesn’t create a real utf-8 file, here’s the explanation I’ve found :

I tried to do something like this :
= utf8_encode ( «Test with accents éèàç» );
$fh = fopen ( ‘test.xml’ , «w» );
fwrite ( $fh , $myString );
fclose ( $fh );
?>

For a mysterious reason, the resulted file shows the accent without the utf-8 conversion.

I tried the binary, mode, etc. etc. And finally I’ve found it :
It seems that fwrite NEEDS to have the utf8_encode function INSIDE its parameters like this, to understand it must create a non-text only file :
= «Test with accents éèàç» ;
$fh = fopen ( ‘test.xml’ , «w» );
fwrite ( $fh , utf8_encode ( $myString ));
fclose ( $fh );
?>
Hope this will help

Some people say that when writing to a socket not all of the bytes requested to be written may be written. You may have to call fwrite again to write bytes that were not written the first time. (At least this is how the write() system call in UNIX works.)

This is helpful code (warning: not tested with multi-byte character sets)

Remember to use double-quotes when outputting special characters such as \n or they come out literally.

if (is_writable($filename) or die («Can not write to «.$filename)) <

this the another sample to use fwrite with create a folder and create the txt file.

= «testdir\\subdir\\test» ;
mkdir ( $mypath , 0777 , TRUE );
$filename = $mypath . ‘\test.txt’ ;
$handle = fopen ( $filename , «x+» );
$somecontent = «Add this to the file Oktavianus» ;
fwrite ( $handle , $somecontent );
echo «Success» ;
fclose ( $handle );
?>

please try.
Oktavianus

After having problems with fwrite() returning 0 in cases where one would fully expect a return value of false, I took a look at the source code for php’s fwrite() itself. The function will only return false if you pass in invalid arguments. Any other error, just as a broken pipe or closed connection, will result in a return value of less than strlen($string), in most cases 0.

Therefore, looping with repeated calls to fwrite() until the sum of number of bytes written equals the strlen() of the full value or expecting false on error will result in an infinite loop if the connection is lost.

This means the example fwrite_stream() code from the docs, as well as all the «helper» functions posted by others in the comments are all broken. You *must* check for a return value of 0 and either abort immediately or track a maximum number of retries.

Below is the example from the docs. This code is BAD, as a broken pipe will result in fwrite() infinitely looping with a return value of 0. Since the loop only breaks if fwrite() returns false or successfully writes all bytes, an infinite loop will occur on failure.

// BROKEN function — infinite loop when fwrite() returns 0s
function fwrite_stream ( $fp , $string ) <
for ( $written = 0 ; $written strlen ( $string ); $written += $fwrite ) <
$fwrite = fwrite ( $fp , substr ( $string , $written ));
if ( $fwrite === false ) <
return $written ;
>
>
return $written ;
>
?>

Be careful of using reserved Windows filenames in fwrite operations.

= fopen ( ‘prn.txt’ , ‘w’ );
fwrite ( $fh , ‘wtf?’ );
echo ‘done’ . PHP_EOL ;
?>

The above script will hang (tested on Windows 7) before it can echo ‘done’.

This is due to another ‘feature’ of our favourite operating system where filenames like prn.xxx, con.xxx, com1.xxx and aux.xxx (with xxx being any filename extension) are Windows reserved device names. Attempts to create/read/write to these files hangs the interpreter.

Note that the optional $length argument is expected to be an int, and cannot be skipped by passing null.

That is, `fwrite($handle, $string, null)` is treated as `fwrite($handle, $string, 0)`, and will write zero bytes, not the whole string.

The result of fwrite could be either FALSE or 0.

So it should be correctly:

if (false === fwrite($handle, $somecontent)) < .

Here you have a function found on the website http://softontherocks.blogspot.com/2014/11/funcion-para-escribir-en-un-fichero-log.html with an example of how to make a log file.

The function is this:

function writeLog($data) <
list($usec, $sec) = explode(‘ ‘, microtime());
$datetime = strftime(«%Y%m%d %H:%M:%S»,time());
$msg = «$datetime'». sprintf(«%06s»,intval($usec*1000000)).»: $data»;
$save_path = ‘foo.txt’;
$fp = @fopen($save_path, ‘a’); // open or create the file for writing and append info
fputs($fp, «$msg\n»); // write the data in the opened file
fclose($fp); // close the file
>

// you want copy dummy file or send dummy file
// it is possible to send a file larger than 4GB and write without FSEEK used is limited by PHP_INT_MAX. it works on a system 32-bit or 64-bit
// fwrite and fread non pas de limite de position du pointeur

= filesize_dir ( «d:\\starwars.mkv» ); // 11,5GB
echo ‘Z:’ , $gfz , PHP_EOL ;

$fz = fopen ( ‘d:\\test2.mkv’ , ‘wb’ );
$fp = fopen ( ‘d:\\starwars.mkv’ , ‘rb’ );
echo PHP_EOL ;
$a = (float) 0 ;
while(( $l = fread ( $fp , 65536 ))) <
fwrite ( $fz , $l );
if(( $a += 65536 )% 5 ) echo «\r» , ‘>’ , $a , ‘ : ‘ , $gfz ;
>

Илон Маск рекомендует:  Объект rfc 2068

fclose ( $fp );
fclose ( $fz );

// test2.mkv’ is 11,5GB

function filesize_dir ( $file ) <
exec ( ‘dir ‘ . $file , $inf );
$size_raw = $inf [ 6 ];
$size_exp = explode ( » » , $size_raw );
$size_ext = $size_exp [ 19 ];
$size_int = (float) str_replace ( chr ( 255 ), » , $size_ext );
return $size_int ;
>
?>

// you want copy dummy file or send dummy file
// it is possible to send a file larger than 4GB and write without FSEEK used is limited by PHP_INT_MAX. it works on a system 32-bit or 64-bit
// fwrite and fread non pas de limite de position du pointeur

= filesize_dir ( «d:\\starwars.mkv» ); // 11,5GB
echo ‘Z:’ , $gfz , PHP_EOL ;

$fz = fopen ( ‘d:\\test2.mkv’ , ‘wb’ );
$fp = fopen ( ‘d:\\starwars.mkv’ , ‘rb’ );
echo PHP_EOL ;
$a = (float) 0 ;
while(( $l = fread ( $fp , 65536 ))) <
fwrite ( $fz , $l );
if(( $a += 65536 )% 5 ) echo «\r» , ‘>’ , $a , ‘ : ‘ , $gfz ;
>

fclose ( $fp );
fclose ( $fz );

// test2.mkv’ is 11,5GB

function filesize_dir ( $file ) <
exec ( ‘dir ‘ . $file , $inf );
$size_raw = $inf [ 6 ];
$size_exp = explode ( » » , $size_raw );
$size_ext = $size_exp [ 19 ];
$size_int = (float) str_replace ( chr ( 255 ), » , $size_ext );
return $size_int ;
>
?>

This may save you time: note that neither «binary-safe file write» nor the use of b mode in fopen mean that fwrite can write binary. It can only write strings (or a single character). For example, attempting to write the byte 0x1 using fwrite results in writing the byte value 0x31.

If you wish to write binary values (bits, bytes, integers, etc.), use a statement like fprintf($Res, «%c», 0x1); . This statement will write a byte to the current offset in the file without converting it to a character (in this case, it will write 0x1).

//fwrite writes over, i.e. this example (win) may be misleading:

$fp = fopen($file, ‘r+b’);

$str = fread($fp, filesize($file));

$str = strtr($str, [chr(0)=>»]);
echo $str.PHP_EOL;//hello0df6ac

fseek($fp, 0);//указатель в начало
fwrite($fp, $str);

//add ftruncate ($ fp, 0);
//this will overwrite the file:

$fp = fopen($file, ‘r+b’);

$str = fread($fp, filesize($file));

$str = strtr($str, [chr(0)=>»]);
echo $str.PHP_EOL;//hello0df6ac

ftruncate ($ fp, 0);
fseek($fp, 0);//указатель в начало
fwrite($fp, $str);

Fwrite — Бинарно-безопасная запись в файл

We recommend upgrading to the latest Google Chrome or Firefox.

Join GitHub today

GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.

manual_PHP / 4_Работа с файлами.md

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

file_exists() — Проверяет наличие указанного файла или каталога

is_readable() — Определяет существование файла и доступен ли он для чтения

is_writable() — Определяет, доступен ли файл для записи

is_executable() — Определяет, является ли файл исполняемым

is_file() — Определяет, является ли файл обычным файлом

filesize() — Определяет, является ли файл обычным файлом

fileatime() — Возвращает время последнего доступа к файлу

filemtime() — Возвращает время последнего доступа к файлу

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

Режимы работы с файлами

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

fclose() — Закрывает открытый дескриптор файла

fread() — Закрывает открытый дескриптор файла

бинарная безопасная запись в файл с помощью php для создания файла DBF

Мне нужно разделить большой файл DBF с помощью функций php, это означает, что у меня есть, например, 1000 записей, мне нужно создать 2 файла по 500 записей в каждом.

У меня нет расширения dbase и я не могу его установить, поэтому мне приходится работать с основными функциями php. Используя основные fread Я могу правильно читать и анализировать файл, но когда я пытаюсь написать новый dbf, у меня возникают некоторые проблемы.

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

Это код, который я использую для анализа файла, и он работает хорошо

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

Я пытался добавить b значение для fopen mode Параметр, как предложено, чтобы открыть его в двоичном виде, я также предложил добавить точно длину строки, чтобы избежать полос некоторых символов, но безуспешно, так как все записанные файлы не в правильном формате DBF. Что я могу сделать, чтобы достичь своей цели?

Решение

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

Ну, это немного сложнее, чем это.

Увидеть Вот для полного описания формата файла DBF.

Поэтому было бы лучше, если бы вы могли использовать библиотеку для чтения и записи файлов dbf.

Если вам действительно нужно сделать это самостоятельно, вот самые важные части:

  • Dbf — это двоичный формат файла, поэтому вы должны читать и писать как двоичный файл. Например, количество записей хранится в 32-разрядном целом числе, которое может содержать ноль байтов.
  • Вы не может использовать строковые функции для этих двоичных данных. Например strlen() будет сканировать данные до первого нулевого байта, который присутствует в этом 32-разрядном целом числе, и вернет неправильное значение.
  • Если вы разделите файл (записи), вам придется настроить количество записей в заголовке.
  • При разделении записей имейте в виду, что каждой записи предшествует дополнительный байт, пробел 0x20 если запись не удалена, звездочка 0x2A если запись удалена. (например, если у вас есть 4 поля по 10 байт, длина каждой записи будет 41) — это значение также доступно в заголовке: bytes 10-11 — 16-bit number — Number of bytes in the record. (Least significant byte first)
  • Файл может заканчиваться маркером конца файла 0x1A так что вам придется проверить и это.

fwrite

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

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

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

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

Fwrite — Бинарно-безопасная запись в файл

(PHP 3, PHP 4 , PHP 5)

fwrite — Бинарно-безопасная запись в файл

Описание int fwrite ( resource handle, string string [, int length] )

fwrite() записывает содержимое string в файловый поток handle . Если передан аргумент length , запись остановится после того, как length байтов будут записаны или будет достигнут конец строки string , смотря что произойдёт первым.

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

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

Пример 1. Простой пример использования fwrite

= ‘test.txt’ ;
$somecontent = «Добавить это к файлу\n» ;

// Вначале давайте убедимся, что файл существует и доступен для записи.
if ( is_writable ( $filename )) <

// В нашем примере мы открываем $filename в режиме «дописать в конец».
// Таким образом, смещение установлено в конец файла и
// наш $somecontent допишется в конец при использовании fwrite().
if (! $handle = fopen ( $filename , ‘a’ )) <
echo «Не могу открыть файл ($filename)» ;
exit;
>

// Записываем $somecontent в наш открытый файл.
if ( fwrite ( $handle , $somecontent ) === FALSE ) <
echo «Не могу произвести запись в файл ($filename)» ;
exit;
>

echo «Ура! Записали ($somecontent) в файл ($filename)» ;

> else <
echo «Файл $filename недоступен для записи» ;
>
?>

Using fwrite to write to a file in your include folder.

PHP does not recognise the permissions setting for the file until you restart the server. this script works fine. (still have to create the blank text file first though. it is not created automatically) On OS X Server..
Using the 1 in fopen tells php to look for the file in your include folder. Change your include folder by altering include_path in php.ini
On OS X Server, php.ini is in private/etc/php.ini.default
copy the file and call it php.ini

the default include path is usr/lib/php
(All these folders are hidden — use TinkerTool to reveal them)

= fopen ( ‘textfile.txt’ , ‘a’ , 1 );
$text = «\n Your text to write \n » . date ( ‘d’ ). «-» . date ( ‘m’ ). «-» . date ( ‘Y’ ). «\n\n» ;
fwrite ( $file , $text );
fclose ( $file );
?>

difficulty appending to file in SAFE MODE ON
if you are getting resource errors etc try this.

$textline=»whatever string you submitted or created»;
$filename=»afilename.log»; // or whatever your path and filename
if (!$handle = fopen($filename, ‘a’)) <
echo «Cannot open file ($filename)»; // or handle your error
exit; >
$textline.=»\n»; // dont forget that period
// now write content to our opened file.
IF (fwrite($handle,$textline) === FALSE)
exit;>
echo «Success, wrote ($textline) to file ($filename)»;
fclose($handle);

if you want to create quickly and without fopen use system, exec

system(‘echo «blahblah» > /path/file’);

I needed to append, but I needed to write on the file’s beginning, and after some hours of effort this worked for me:

$file = «file.txt»;
if (!file_exists(«file.txt»)) touch(«file.txt»);
$fh = fopen(«file.txt», «r»);
$fcontent = fread($fh, filesize(«file.txt»));

$towrite = «$newcontent $fcontent»;

$fh22 = fopen(‘file.txt’, ‘w+’);
fwrite($fh2, $towrite);
fclose($fh);
fclose($fh2);

Watch out for mistakes in writting a simple code for a hit counter:
= fopen ( ‘cont.txt’ , ‘r’ );
$incr = fgets ( $cont );
//echo $incr;
$incr ++;
fclose ( $cont );
$cont = fopen ( ‘cont.txt’ , ‘a’ );
fwrite ( $cont , $incr );
fclose ( $cont );
?>

Why? notice the second fopen -> $cont=fopen(‘cont.txt’,’a’);
it opens the file in writting mode (a). And when it ads the incremented
value ( $incr ) it ads it ALONG the old value. so opening the counter
page about 5 times will make your hits number look like this
012131214121312151.21312141213E+ . you get the piont.
nasty, isn’t it? REMEMBER to open the file with the ‘w’ mode (truncate
the file to 0). Doing this will clear the file content and it will make sure that
your counter works nice. This is the final code

= fopen ( ‘cont.txt’ , ‘r’ );
$incr = fgets ( $cont );
//echo $incr;
$incr ++;
fclose ( $cont );
$cont = fopen ( ‘cont.txt’ , ‘w’ );
fwrite ( $cont , $incr );
fclose ( $cont );
?>

Notice that this work fine =)
XU (alias Iscu Andrei)

In PHP 4.3.7 fwrite returns 0 rather than false on failure.
The following example will output «SUCCESS: 0 bytes written» for existing file test.txt:

$fp = fopen(«test.txt», «rw»);
if (($bytes_written = fwrite($fp, «This is a test»)) === false) <
echo «Unable to write to test.txt\n\n»;
> else <
echo «SUCCESS: $bytes_written bytes written\n\n»;
>

Hope this helps other newbies.

If you are writing data to a txt file on a windows system and need a line break. use \r\n . This will write hex OD OA.

i.e.
$batch_data= «some data. \r\n»;
fwrite($fbatch,$batch_data);

The is the equivalent of opening a txt file in notepad pressing enter and the end of the line and saving it.

[Ed. Note:
The runtime configuration setting auto_detect_line_endings should solve this problem when set to On.]

I figured out problems when writing to a file using \r as linebreak, after that file() wasn’t able to read the data from that file.
Using \n solved the problem.

the fwrite output striped the slashes if without length argument given, example:

= «c:\\01.txt» ;
$out = fopen ( «out.txt» , «w» );
fwrite ( $out , $str );
fclose ( $out );
?>

the out.txt will be:
c:^@1.txt
the ‘\\0’ without escape will be ‘\0’ ==> 0x00.

the correct one is change fwrite to:
fwrite($out, $str, strlen($str));

Use caution when using:

$content = fread($fh, filesize($fh)) or die «Error Reading»;

This will cause an error if the file you are reading is zero length.

if ( false === fread($fh, filesize($fh)) ) die «Error Reading»;

Thus it will be successful on reading zero bytes but detect and error returned as FALSE.

Don’t forget to check fwrite returns for errors! Just because you successfully opened a file for write, doesn’t always mean you can write to it.

On some systems this can occur if the filesystem is full, you can still open the file and create the filesystem inode, but the fwrite will fail, resulting in a zero byte file.

Обработка бинарных файлов

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

Составим программу создания нового файла с информацией о городах: код, название, численность жителей.

typedef struct city

f=fopen(«file1.dat»,»wb»); //открытие бинарного файла для записи

printf(«\n Ввод информации о городе «);

printf(«\nназвание: «); scanf(«%s», t.name);

printf(«\nколичество жителей: «); scanf(«%ld», &t.c);

fwrite(&t, sizeof(t), 1, f); //запись в файл одной структуры t

printf(«\n END Закончить? y/n «);

Выполнение этой программы приведет к созданию бинарного файла с информацией о городах.

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

typedef struct city

f=fopen(«file1.dat»,»rb»); //открытие бинарного файла для чтения

fread(&t, sizeof(t), 1, f); //чтение из файла одной структуры t

printf(«\n%3d название: %10s количество жителей: %ld»,

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 8806 — | 7522 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

бинарная безопасная запись в файл с помощью php для создания файла DBF

Мне нужно разделить большой файл DBF с помощью функций php, это означает, что у меня есть, например, 1000 записей, мне нужно создать 2 файла по 500 записей в каждом.

У меня нет расширения dbase, и я не могу его установить, поэтому мне приходится работать с основными функциями php. Используя базовую функцию fread я могу правильно прочитать и проанализировать файл, но когда я пытаюсь написать новый dbf, у меня возникают некоторые проблемы.

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

Это код, который я использую для анализа файла, и он работает хорошо

first_line — это переменная, которая содержит данные заголовка, но когда я пытаюсь записать их в новый файл, происходит что-то неправильное, и строка не записывается точно так, как она была прочитана. Вот код, который я использую для написания:

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

1 ответ

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

Ну, это немного сложнее, чем это.

Смотрите здесь для полного описания формата файла DBF.

Поэтому было бы лучше, если бы вы могли использовать библиотеку для чтения и записи файлов dbf.

Если вам действительно нужно сделать это самостоятельно, вот самые важные части:

  • Dbf — это двоичный формат файла, поэтому вы должны читать и записывать его как двоичный файл . Например, количество записей хранится в 32-разрядном целом числе, которое может содержать ноль байтов.
  • Вы не можете использовать строковые функции для этих двоичных данных . Например, strlen() будет сканировать данные до первого нулевого байта, который присутствует в этом 32-разрядном целом числе, и вернет неправильное значение.
  • Если вы разделите файл (записи), вам придется настроить количество записей в заголовке.
  • При разделении записей имейте в виду, что каждой записи предшествует дополнительный байт, пробел 0x20 если запись не удалена, и звездочка 0x2A если запись удалена. (например, если у вас есть 4 поля по 10 байтов, длина каждой записи будет равна 41) — это значение также доступно в заголовке: bytes 10-11 — 16-bit number — Number of bytes in the record. (Least significant byte first) bytes 10-11 — 16-bit number — Number of bytes in the record. (Least significant byte first)
  • Файл может заканчиваться маркером 0x1A файла 0x1A , так что вам нужно будет это проверить.
Илон Маск рекомендует:  CS Yazzle описание
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL