1

有问题的文本文件名为 fp.txt,每行包含 01、02、03、04、05、...10。

01
02
...
10

代码:

<?php
//test file for testing fseek etc
$file = "fp.txt";
$fp = fopen($file, "r+") or die("Couldn't open ".$file);
$count = 0;
while(!(feof($fp))){ // till the end of file
    $text = fgets($fp, 1024);
    $count++;
    $dice = rand(1,2); // just to make/alter the if condition randomly
    echo "Dice=".$dice." Count=".$count." Text=".$text."<br />";
    if ($dice == 1){
        fseek($fp, -1024, SEEK_CUR);
    }
}
fclose($fp);
?>

所以,因为 fseek($fp, -1024, SEEK_CUR); 无法正常工作。我想要的是如果 Dice == 1,将文件指针设置为上一行,即比当前行高一行。但我认为负值是将文件指针设置为文件结尾,从而在文件实际结尾之前结束 while 循环。

期望的输出是:

Dice=2 Count=1 Text=01 
Dice=2 Count=2 Text=02
Dice=2 Count=3 Text=03
Dice=1 Count=4 Text=03
Dice=2 Count=5 Text=04
Dice=2 Count=6 Text=05
Dice=2 Count=7 Text=06
Dice=1 Count=8 Text=06
Dice=1 Count=9 Text=06
Dice=2 Count=10 Text=07
....                                    //and so on until Text is 10 (Last Line)
Dice=2 Count=n Text=10

请注意,只要 dice 为 2,则文本与前一个相同。现在它只是在第一次出现 Dice=1 时停止

所以基本上我的问题是如何将文件指针移动/重新定位到上一行?

请注意 dice=rand(1,2) 只是示例。在实际代码中,$text 是一个字符串,当字符串不包含特定文本时 if 条件为真。

编辑:已解决,两个样本(@hakre 和我的)都按需要工作。

4

2 回答 2

4

您从文件中读出了一行,但仅在骰子不是 1 时才转发到下一行。

考虑为此使用SplFileObject,它提供了一个更适合您的场景的界面,我会说:

$file = new SplFileObject("fp.txt");
$count = 0;
$file->rewind();    
while ($file->valid())
{
    $count++;
    $text = $file->current();
    $dice = rand(1,2); // just to make alter the if condition randomly
    echo "Dice=".$dice." Count=".$count." Text=".$text."<br />";
    if ($dice != 1)
    {
       $file->next();
    }
}
于 2012-06-10T16:45:41.183 回答
1
<?php
$file = "fp.txt";
$fp = fopen($file, "r+") or die("Couldn't open ".$file);
$eof = FALSE; //end of file status
$count = 0;
while(!(feof($fp))){ // till the end of file
    $current = ftell($fp);
    $text = fgets($fp, 1024);
    $count++;
    $dice = rand(1,2); // just to alter the if condition randomly
    if ($dice == 2){
            fseek($fp, $current, SEEK_SET);
    }
    echo "Dice=".$dice." Count=".$count." Text=".$text."<br />";
}
fclose($fp);
?>

此示例也可以按要求工作。

这些变化是:

* Addition of "$current = ftell($fp);" after while loop.
* Modification of fseek line in if condition.
* checking for dice==2 instead of dice==1
于 2012-06-10T16:56:57.047 回答