Пробле с чтением из фаила после записи в него

col

Guest
Пробле с чтением из фаила после записи в него

Люди я уже ничего. Запарился просто.
Объясните мне плиз. Почему вот этот код не работает, хотя по моей логике он правильный.
PHP:
 if(!$fp=fopen($sys_dir.$f_check_sum,"r+"))
   {
    $fp=fopen($sys_dir.$f_check_sum,"w+");                         
   }

  if(!$old_all_size=fread($fp, filesize($sys_dir.$f_check_sum)))
   {
    fwrite($fp,"1");
    fclose($fp);
    $fp=fopen($sys_dir.$f_check_sum,"r+");
    $old_all_size=fread($fp, filesize($sys_dir.$f_check_sum));    
   }
  fclose($fp);
Непахает с первого раза чтение.

А вот этот модифицированный, который не должен работать. Во преки всем правилам пашет тока в путь.
PHP:
 if(!$fp=@fopen($sys_dir.$f_check_sum,"r+"))
  {
    $fp=@fopen($sys_dir.$f_check_sum,"w+");                       
    fwrite($fp,"1");
    fclose($fp);         // строка 5 указатель закрываеться
   }

  if(!$old_all_size=@fread($fp, filesize($sys_dir.$f_check_sum)))
   {
    $fp=fopen($sys_dir.$f_check_sum,"r+");
    $old_all_size=fread($fp, filesize($sys_dir.$f_check_sum));    
   }
  fclose($fp);
А вот работающий но это бред какойто он НЕ ДОЛЖЕН работать. В строке 5 после записи в фаил указатель ЗАКРЫВАЕТЬСЯ (я так понимаю обнуляеться) и следовательно дальнейшая работа с ним не возможна. Но дальше только выводится предупреждение, а остальное как по маслу. ДУРДОМ.
 

Voxus

founder (Старожил PHPCluba)
$fp=fopen($sys_dir.$f_check_sum,"r+") or $fp=fopen($sys_dir.$f_check_sum,"w+");

?
 

Mammoth

Guest
Кхм. Какой ужасный стиль программирования, от одной только конструкции
PHP:
if(!$fp=fopen($sys_dir.$f_check_sum,"r+")) 
   { 
    $fp=fopen($sys_dir.$f_check_sum,"w+");                          
   }
с ума сойти можно (какая-то поговорка есть на эту тему, забыл блин. кажется : "не догоним, так хоть согреемся")...

Вобщем col, программа работает так, как ты ее запрограммировал...

ЗЫ. Разделять надо чтение и запись, col. Нельзя заниматься всем сразу.
 

col

Guest
то Mammoth
Слушай дядя PHPМонстр. Причесать то ты меня причесал и помоями облить не забыл. :) Но это всё понятно. Но мне никто так и не объяснил почему во втором случае прога работает а в первом нет. И что значит: Разделять надо чтение и запись.
На кой черт тогда ключи w и w+. Или я что то напутал.
PS
И скажи на милость, что такого ужасного в
PHP:
if(!$fp=fopen($sys_dir.$f_check_sum,"r+"))  
   {  
    $fp=fopen($sys_dir.$f_check_sum,"w+");                           
   }
Научи... А вось и я когда когонить причешу за это, а он и меня дядей PHPМонстром назовет. :) А ? Гуру обьяснишь или как все обычно отправишь далеко далеко ..
 

RomikChef

Guest
я не разбирался, в чем проблема, но скорее всего, судя по заголовку темы, в
[m]clearstatcache[/m]

ОЙ! и правда страшно!
если открылся на чтение и запись, то открыть на запись :))))

слушай, а кто тебе мешает сделать по-человечески?
сначала открыть на чтение, сделать что надо, хакрыть, открыть на запись, записать, что надо, закрыть?
 

Mammoth

Guest
Автор оригинала: col
то Mammoth
Слушай дядя PHPМонстр.
Кхм. Слушаю тебя, племяш.

Причесать то ты меня причесал и помоями облить не забыл. :) Но это всё понятно.
Да уж, тут непонятного быть ничего быть не может, в отличие от некоторых постов жалких людишек... ;-)

Но продолжай, продолжай... постараюсь тебя больше не прерывать.

Но мне никто так и не объяснил почему во втором случае прога работает а в первом нет. И что значит: Разделять надо чтение и запись.
Как это тебе никто не объяснил? Что же ты раньше молчал? Не позднее ближайшего хеллоуина соберем всех старейшин и будем разбираться. И обязательно найдем виноватого...

На кой черт тогда ключи w и w+. Или я что то напутал.
Как это? Ты пользовался моими ключами? Я же их спрятал... ;-(
Вот сорванец! Весь в папу пошел...


PS. col, просьба не воспринимать это как очередные "помои"... ;-)


PPS.
И скажи на милость, что такого ужасного в
PHP:
if(!$fp=fopen($sys_dir.$f_check_sum,"r+"))  
   {  
    $fp=fopen($sys_dir.$f_check_sum,"w+");                           
   }
Научи... А вось и я когда когонить причешу за это, а он и меня дядей PHPМонстром назовет. :) А ? Гуру обьяснишь или как все обычно отправишь далеко далеко ..
А? Ты мне? Ах ты льстец, знаешь ведь что я еще не PHPClub Guru, а?
 

Mammoth

Guest
Ну а если серьезно, то первый код у тебя не работает из-за второй проверки. Второй код у тебя "проверку" проходит. Догадайся сам почему.

Хотя нет, лучше - скажу: из-за
PHP:
fwrite($fp,"1");
 

Mammoth

Guest
Хотя нет. Во втором случае - другой случай. ;-)
Тут ты мог бы с тем же успехом написать просто
PHP:
if(!$old_all_size)
...
 

col

Guest
:) Слуш Mammoth, это наверое из-за твоего ну уж очень большого PHPскила. Ощущения после разговора с тобой, что вы с крышей живете врозь. :) Или тырмандырским языком ты владеешь в СОВЕРШЕНСТВЕ. :) Так как я 90% сказанного тобой НУ ВАЩЕ не пол. :-/ Ну куда уж мне..... :)
Ну а так как ТЫ вызвался вправить мне мозг, то уж не взыщи, донимать своими вопросами я буду теперь ТЕБЯ. :)
Я не пол причем здесь вторая проверка, в первом коде.
PHP:
 if(!$old_all_size=@fread($fp, filesize($sys_dir.$f_check_sum)))
Здесь я всего лишь проверяю записалось ли значение из файла в переменную. Тем самым проверяю пустой ли он был или нет. Ведь так ?
а вот в этом if, опять же на сколько это Я понимаю
PHP:
if(!$fp=fopen($sys_dir.$f_check_sum,"r+")) 
   { 
    $fp=fopen($sys_dir.$f_check_sum,"w+");                          
   }
я пытаюсь открыть фаил на чтение и запись, ну если быть точным получить указатель который будет установлен в начало файла. Если это ложь, то создаю этот самый фаил и получаю указатель опять таки на чтение и запись, для того что бы потом в него записать 1, после второй проверки. Ну в чем я не прав ?
И еще я тут с этим скриптом снашался снашался и выщемил что глючит именно
PHP:
  if(!$old_all_size=fread($fp, filesize($sys_dir.$f_check_sum))) 
   { 
    fwrite($fp,"1"); 
    fclose($fp); 
    $fp=fopen($sys_dir.$f_check_sum,"r+"); 
    $old_all_size=fread($fp, filesize($sys_dir.$f_check_sum)); //  вот эта сторка     
   } 
  fclose($fp);
вот эта строка $old_all_size=fread($fp, filesize($sys_dir.$f_check_sum)); в этом месте невыдаёться никакой ошибки, но почемуто в переменную значение из файла не считываються.
И последнее почему во втором скрипте в строке 5 (см.выше) указатель закрываеться на фаил а потом не открывая его всё дальше работает, вот где БРЕД.
PS
Жду ответа с трепетом и нажедой........ :)
 

col

Guest
to RomikChef
я могу ошибаться но я пробовал clearstatcache()
но под виндой это вроде никакого эфекта не даёт
Хотя я мог и не допереть.
 

RomikChef

Guest
Кол.
Сказали тебе - не открывай файл два раза.
Открыл, сделал что надо, закрыл. снова открыл на дпругую операцию - закрыл.
Зачем ты вкладываешь операции с файлами одну в другую?

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

col

Guest
to RomikChef
И еще
ОЙ! и правда страшно!
если открылся на чтение и запись, то открыть на запись :))))
это прикол или что, почему ТО.
Если НЕ открылся на чтение и запись, то создать новый и открыть на чтение и запись.
Вроде на сколько мне известно r+ от w+ отличаються только тем, что во втором случае содержимое фаила обнуляеться и если такого файла нет то его создают. А что там чтение и запись ( r+), что там (w+) разве нет ? :(
PS
Что то у меня ощущения, что я не доку по php с www.php.net читал, а филькину грамоту. :)
 

col

Guest
RomikChef
слуш почему
Сказали тебе - не открывай файл два раза.
ведь в первый if входим только если в первой попытке открыть фаил ничего не получилось, значит он и не открылся ведь так.

Ну ваще код у же есть, Второй и работает.

Ну я не прочь посмотреть на эталон.
Задача:
Нужно открыть фаил и прочитать содержимое в переменную если файла нет нужно его создать, записать туда 1 и считать это значение в переменную.
PS
Вот и всё.
 

RomikChef

Guest
Какие-то у тебя просто параноидальные проверки.
Будь проще.
 

RomikChef

Guest
PHP:
$fd = fopen ($filename, "r");
$var = fread ($fd, filesize ($filename));
fclose ($fd);  
if (!$var) {
  $var=1;
  $fd = fopen ($filename, "w");
  $res=fwrite($fd, $var));
  fclose ($fd);
}
if ($res==-1) echo "there was error!";
else $var2=$var;
 

col

Guest
гы и типа работаем с $var2 да ?
Прикол. Ох уж мне эти ТАНКИСТЫ. Сенкс.
PS
Но почему всё таки.
Там работает, а там нет. :(
Просто любопытно.
 

RomikChef

Guest
нет, работаем с вар
вар2 = это для примера использования.
 

col

Guest
гы гы Ромик
ну так просто для статистики
8 строк моего кода против 10 твоих.
PS
Просто для стаистики и не больше.
 

.des.

Поставил пиво кому надо ;-)
col эффективность кода не всегда измеряется количеством строк.
К примеру использование регов -> 1 строка
против некоторых действий (если возможно конечно) без них, но строк допустим 10 и чаще всего реги медленнее.
Слушай что тебе говорят.
Ромик тебе указал верное направление.
 
Сверху