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); のためです。正常に動作していません。私が欲しいのは、ダイス== 1の場合、ファイルポインタを前の行、つまり現在の行より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

サイコロが 2 の場合、テキストは前のものと同じであることに注意してください。Dice=1 が最初に出現した時点で停止しています。

基本的に私の質問は、ファイルポインタを前の行に移動/再配置する方法ですか?

dice=rand(1,2) は単なる例であることに注意してください。実際のコードでは、$text は文字列であり、文字列に特定のテキストが含まれていない場合に if condition が true になります。

編集: 解決済み。両方のサンプル (@hakre と私のもの) が希望どおりに機能しています。

4

2 に答える 2

4

ファイルから 1 行を読み取りますが、サイコロが 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 に答える