Forum Webscript.Ru

Программирование => Perl => Тема начата: C++ от 17 Августа 2002, 15:16:59

Название: Открытие файла на чтение и запись???
Отправлено: 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);
         }

Он должен прочитать данные из файла, изменить нужное и записать обратно в ту же позицию. Но ничего этого не происходит...
Когда файл открываю в режиме "+>", то он попросту стирает все данные из файла. А в приведенном выше варианте данные  даже не считываются.
Что я не правильно делаю?
Спасибо
Название: Открытие файла на чтение и запись???
Отправлено: Serchey от 17 Августа 2002, 18:16:54
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);

И все! Удачи.
Название: Открытие файла на чтение и запись???
Отправлено: C++ от 17 Августа 2002, 21:35:17
Цитировать
для начала - если ты хочешь обновить файл, используй \'+<\'.

Я его так и открываю, но только он мне не дает с него читать почему-то...
Не понял, а зачем файл рубить под ноль??? Мне данные находящиеся в нем нельзя убивать....
Название: Открытие файла на чтение и запись???
Отправлено: C++ от 17 Августа 2002, 22:57:59
Все, решение проблемы найдено... На самом деле и проблемы то не было, всему виной моя невнимательность.
З.Ы. Всем спасибо.
Название: Открытие файла на чтение и запись???
Отправлено: Serchey от 18 Августа 2002, 09:51:21
Ну так напиши, чтоб мы были повнимательнее! :)
Название: Открытие файла на чтение и запись???
Отправлено: C++ от 18 Августа 2002, 10:50:56
Цитировать
$a=unpack($strTemplate,$data);

а надо
Цитировать
@a=unpack($strTemplate,$data);

т.е. вместо списка скаляр стоял...
Название: Открытие файла на чтение и запись???
Отправлено: Serchey от 18 Августа 2002, 19:00:24
Вот и я - увидел, почухал затылок, и опустил в своем примере. Чтож буть внимательнее в следующий раз. Удачи!
Название: Открытие файла на чтение и запись???
Отправлено: C++ от 18 Августа 2002, 23:34:22
Народ, а вообще, может кто-нибудь готов рассказать о подводных камнях при открытии файла на чтение и запись? Думаю не мне одному было бы это интересно. Просто, хоть эта проблема и решена, зато появилась куча новых багов, о которых пока не хочу писать (буду сам пробовать исправлять).
Расскажите, будет очень полезно!