Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Блочная запись в файл


Автор: Blaga 2.2.2009, 15:27
Доброго времени суток!
Есть такая проблема. Значит есть у меня файл который нужно прочитать, удалить повторки а записать заново, но по условию его нельзя читать сразу всего. То есть прочесть функцией file а потом убрать все повторки через array_unique не получеться. 
Как сделал я 
Код

<?php
$handle = fopen("res.txt", "r");
$handle2 = fopen("result.txt", "a+");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo "buffer=".$buffer."<br>";
    do {
        $buf = fgets($handle2, 4096);
        echo "buf=".$buf."<br>";
        if($buf != $buffer)
        fwrite($handle2,$buffer);
        } while (!feof($handle2)) ;

}
fclose($handle);
fclose($handle);
?>

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

Автор: Dima 2015 2.2.2009, 16:39
Blaga, а чего за условие такое стремное, что ф-цию file юзать нельзя? Тест чтоли какой-то?

Но что мешает загнать файл в массив построчно твоим собственно способом:

while (!feof($handle)) {
    $buffer[] = fgets($handle, 4096);

Получишь ты массив строк файла $buffer, потом спокойно на него array_unique повесишь и усе...

Автор: Blaga 2.2.2009, 17:37
да, это тест. так делать нельзя потому что в условии задачи есть пункт что размер файла много превышает размер памяти.

Автор: Blaga 2.2.2009, 19:11
решилось таким кодом.
Код

<?php
global $len_buffer;
$res = "resultus.txt";
$file = "res.txt";
$len_buffer = "4096";
$size1 = filesize($res);
$size2 = filesize($file);

Uslovar ($file,$res);

/*Функция поиска повторов строк */
function Ustr ($fp, $str)
{
   global $len_buffer;
   fseek($fp,0);
   while (!feof ($fp)) {
      $temp = trim(fgets($fp,$len_buffer));
      if ($str == $temp)
      return false;
   }
   return true;
}

/*Функция занесения уникальных слов в результирующий файл*/
function Uslovar ($slovar1,$res)
{
   global $len_buffer;
   $result = fopen($res, 'a+') or die ("Can't open file $res for writing");
           $size = filesize ($slovar1);
           $fp = fopen ($slovar1, 'r') or die ("No such file - $slovar1");
           while (!feof ($fp)) {
                $temp = trim (fgets ($fp, $len_buffer));
                if (Ustr ($result, $temp)) {
                     fseek ($result, 0, SEEK_END);
                     fwrite ($result, $temp . "\r\n");
                }
              }
           fclose ($fp);
   fclose ($result);
}
?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)