2011-03-31 1 views
0

Я пытаюсь извлечь содержимое из txt-файла. Этот файл является динамическим, поскольку данные сохраняются приложением к нему каждый раз, когда цикл выполняется. Внутри этого цикл лежит мою логику для извлечения содержимого из файла, как следует ...Извлечение из текстового файла DYNAMIC _ Основная проблема с PHP

$length = filesize($filename); 
fseek($fd,$previousLength); 
$contents = fread($fd,(($length - $previousLength))); 
$previousLength = $length; 

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

114134, 144, 1443, 1433 ... 
(n of these written every once in loop) ... 

Если я прочитал п значений, скажем

114134, 144 ... 

в первом цикле ...

в следующий раз, мне нужно прочитать только

1443, 1443 and NOT 114134, 144 .... 

Fread() терпит неудачу несчастно здесь, и FSEEK не помогает (ссылка мой код выше) ...

Я DON "T ЗНАЕТЕ ПОЧЕМУ !! необходимую помощь как можно скорее ..

Благодаря

ответ

0

Если вы открыли файл в режиме добавления, то man page for fseek говорит:

Если вы открыли файл в Append (а или +) режим, любые данные, записи в файл всегда будет добавляться, независимо от того, положение файла, а результат вызова функции fseek() будет неопределенным.

В следующем коде несколько модификаций. У меня было несколько проблем с длиной - fread действительно требует этого, но я решил использовать fgets, чтобы избежать этого. Это останавливается на символах новой строки, но имеет удобную функцию чтения всего оставшегося содержимого файла в противном случае. Там может быть лучший способ сделать это, но это действительно работает.

<?php 
$filename = 'loopFile.txt'; 
$previousLength = 0; 
$n = 0; 

$fw = fopen($filename, 'a+'); 
$fr = fopen($filename, 'r'); 

for ($i=0; $i < 15; $i++) 
{ 
    // Put a random number of numbers into the file. 
    $numberOfNumbers = rand(0, 5); 

    for ($writeCount = 0; $writeCount < $numberOfNumbers; $writeCount++) 
    { 
     fwrite($fw, $i . '_' . $n++ . ', '); 
    } 

    fseek($fr, $previousLength); 
    $contents = fgets($fr); 

    if (!empty($contents)) 
    { 
     echo 'On iteration: ' . $i . ' read: ' . $contents . "\n"; 
    } 
    else 
    { 
     echo 'On iteration: ' . $i . ' no new data appended to file.' . "\n"; 
    } 

    $previousLength += strlen($contents); 
} 

fclose($fw); 
fclose($fr); 

?> 
+0

так? Мой код неправильный? – Zac

+0

Я буду редактировать в некотором коде, который работает. – Paul

0

Не уверен, что если бы я получил это право, но вы читаете данные из файла что вы добавляете в тот же цикл?

Это данные, которые вы пишете все отдельные строки, добавленные в файл? Вместо этого вы можете посмотреть на команду file(), она считывает каждую строку в массив ... You может затем array_slice() правильные линии из массива путем подсчета строк до ситуации, затем после ситуации.

+0

"но вы читаете данные из файла, который вы добавляете в том же цикле?" - ДА . Пожалуйста, посмотрите пример, который я упомянул. Написанные данные разделены запятой, которую я UNdelimiting с помощью explode ... это не проблема ... Проблема заключается в том, чтобы читать только прилагаемые данные, а не из сначала снова ... надеюсь, у меня это получилось. – Zac

+0

@Zac Да, теперь я понял. Я разместил это, прежде чем вы изменили свой вопрос. Позвольте мне подумать об этом ... – Jorg

 Смежные вопросы

  • Нет связанных вопросов^_^