Forum Webscript.Ru
Программирование => Perl => Тема начата: C++ от 17 Августа 2002, 15:16:59
-
Есть кусок кода:
open(STATS,"+<$stats_file") or die;
binmode(STATS);
flock(STATS,2);
while(read(STATS,$data,$rec_size))
{
$a=unpack($strTemplate,$data);
if($a[1]==$id)
last
{
if(seek(STATS,-$rec_size,1))
{ print STATS pack($strTemplate,@a);
flock(STATS,8); close(STATS);
}
Он должен прочитать данные из файла, изменить нужное и записать обратно в ту же позицию. Но ничего этого не происходит...
Когда файл открываю в режиме "+>", то он попросту стирает все данные из файла. А в приведенном выше варианте данные даже не считываются.
Что я не правильно делаю?
Спасибо
-
C++, для начала - если ты хочешь обновить файл, используй \'+<\'.
flock(STATS,8);
- такого вовсе делать не стоит, просто сделай close(STATS); - блок будет снят автоматом.
Окей, теперь посмотрим... ага..., пожалуй я бы сделал это так:
open(STATS,"+<$stats_file") or die;
binmode(STATS);
flock(STATS,2);
while(read(STATS,$data,$rec_size)){
# делаем с $data все чот хотим
}
seek(STAT,0,0); # - в начало файла;
truncate(STAT,0); # - рубим файл под ноль;
print STAT "Anything\\n";
close(STAT);
И все! Удачи.
-
для начала - если ты хочешь обновить файл, используй \'+<\'.
Я его так и открываю, но только он мне не дает с него читать почему-то...
Не понял, а зачем файл рубить под ноль??? Мне данные находящиеся в нем нельзя убивать....
-
Все, решение проблемы найдено... На самом деле и проблемы то не было, всему виной моя невнимательность.
З.Ы. Всем спасибо.
-
Ну так напиши, чтоб мы были повнимательнее! :)
-
$a=unpack($strTemplate,$data);
а надо @a=unpack($strTemplate,$data);
т.е. вместо списка скаляр стоял...
-
Вот и я - увидел, почухал затылок, и опустил в своем примере. Чтож буть внимательнее в следующий раз. Удачи!
-
Народ, а вообще, может кто-нибудь готов рассказать о подводных камнях при открытии файла на чтение и запись? Думаю не мне одному было бы это интересно. Просто, хоть эта проблема и решена, зато появилась куча новых багов, о которых пока не хочу писать (буду сам пробовать исправлять).
Расскажите, будет очень полезно!