Проблема с записью в файл

Slastik

Новичок
Проблема с записью в файл

PHP:
$f_name="/usr/..../ip/test/base.dat";
fclose(fopen($f_name,"a+b"));

$f = fopen ($f_name, "r+b") or die("Sorry could not open file");
flock($f,LOCK_EX);

$data = file_get_contents("http://noc.ix.net.ua/ua-list.txt"); 
echo '<pre>';
print_r($data);

fwrite($f,$data); 
fclose($f);
юзай этот код для выкачивания файла ua-list.txt и записи его в base.dat.
print_r($data); мне выдает точно такой же список как имеется в удаленном файле.

по после сохранения к нужному контенту у меня добавляется еще часть, не могу понять откуда она берется
например вот такой кусок


0
217.199.227.0
7.175.80.0/20
217.196.160.0/21
217.198.128.0/20
217.198.130.0/23
217.198.132.0/22
217.198.140.0/23
217.198.142.0/23
217.199.224.0/20
217.199.225.0
217.199.227.0
 

Фанат

oncle terrible
Команда форума
читаем документацию по fopen, и совершаем не безумные телодвижения а-ля слепой слон на пожаре, а осмысленные действия.

закрепить материал самостоятельными экспериментами
 

Slastik

Новичок
Автор оригинала: Фанат
читаем документацию по fopen, и совершаем не безумные телодвижения а-ля слепой слон на пожаре, а осмысленные действия.

закрепить материал самостоятельными экспериментами
документация по fopen мне ничем не помогла а вот котеров выручил
а именно строчки
PHP:
ftruncate($f,0);
fseek($f,0,SEEK_SET);
[off]приятно было услышать старого ворчливого фаната :)[/off]
 

zxc

Новичок
А вот эта строчка зачем? :)
fclose(fopen($f_name,"a+b"));


+ Зачем ты лочишь файл так рано? Почему бы не залочить его прямо перед записью?

-~{}~ 19.07.06 14:55:

Наверняка Котеров, в своей книжке, писал этот код в совершенно другом контексте.
Почитай мануал внимательно и конкретно "список возможных режимов для fopen()"
http://ru.php.net/manual/ru/function.fopen.php
 

Slastik

Новичок
Автор оригинала: zxc
А вот эта строчка зачем? :)
fclose(fopen($f_name,"a+b"));
эта строчка нужна что бы создать файл если его не существует, и не разрушить если он существует.
если бы не было строчки этой, то следующая строчка в случае отсутствия файла выдавала бы ошибку:
PHP:
$f = fopen ($f_name, "r+b") or die("Sorry could not open file");
+ Зачем ты лочишь файл так рано? Почему бы не залочить его прямо перед записью?
угу, одну строчку вынес
теперь у меня такой код
PHP:
fclose(fopen($f_name,"a+b"));

$data = file_get_contents("http://noc.ix.net.ua/ua-list.txt"); 
$f = fopen ($f_name, "r+b") or die("Sorry could not open file");
flock($f,LOCK_EX);
ftruncate($f,0);
fseek($f,0,SEEK_SET);

fwrite($f,$data); 
fclose($f);
Наверняка Котеров, в своей книжке, писал этот код в совершенно другом контексте.
Почитай мануал внимательно и конкретно "список возможных режимов для fopen()"
http://ru.php.net/manual/ru/function.fopen.php
почитал внимательно
режим w, w+ не совместим с блокировкой, а режим a+ по опыту котерова вызывает глюки в некоторых версиях FreeBSD поэтому выбран именно режим r+
 

Slastik

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

а понял, ты имеешь ввиду, что он чистит файл, тогда да.
угу )

-~{}~ 19.07.06 15:44:
 
Сверху