【问题标题】:Extracting from a DYNAMIC text file _ basic PHP problem从 DYNAMIC 文本文件中提取 _ 基本 PHP 问题
【发布时间】:2011-03-31 03:17:24
【问题描述】:

我正在尝试从 txt 文件中提取内容。该文件是动态的,因为每次执行循环时都会不断向其附加数据。 在这个循环中,我的逻辑是从文件中提取内容,如下...

$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 ) ... 

如果我读取了 n 个值,比如说

114134, 144 ... 

在第一个循环中...

下一次,我只需要阅读

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

fread() 在这里惨遭失败,并且 fseek 没有帮助(参考我上面的代码)...

我不知道为什么!!需要尽快帮助..

谢谢

【问题讨论】:

    标签: php file extract text-files


    【解决方案1】:

    如果您以附加模式打开文件,那么man page for fseek 会说:

    如果您以追加(a 或 a+)模式打开文件,则无论文件位置如何,您写入文件的任何数据都将始终被追加,并且调用 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);
    
    ?>
    

    【讨论】:

      【解决方案2】:

      不确定我是否正确,但您正在从要附加到同一循环中的文件中读取数据?

      您写入的所有单独行的数据是否已添加到文件中?您可以查看 file() 命令,它将每一行读入一个数组...然后您可以通过在前一种情况下计算行数,然后在后一种情况下计算数组中的行数,从而从数组中取出正确的行。

      【讨论】:

      • “但是你正在从一个文件中读取数据,你在同一个循环中附加了这个文件?” - 是的 。请看我提到的例子..写入的数据用逗号分隔,我使用explode取消分隔......这不是问题......问题是只读取附加的数据而不是从第一次……希望你明白了。
      • @Zac 是的,现在我明白了。在你编辑你的问题之前,我发布了这个。让我想想……
      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多