2012-06-10 113 views
1

問題中的文本文件名爲fp.txt,每行包含01,02,03,04,05,... 10。如何將文件指針移動到php中的上一行?

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,將文件指針設置爲上一行,即比當前行更上一行。但我認爲負值是將文件指針設置爲文件結尾,從而結束文件實際結束之前的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,文字是一樣的前一個。現在它只是停止在第一次出現骰子= 1

所以基本上我的問題是如何移動/重定位文件指針到上一行?

請注意,dice = rand(1,2)就是例子。在實際的代碼中,$ text是一個字符串,並且如果在字符串不包含特定文本時條件成立。

編輯: 解決,這兩個樣本(@hakre的&礦)正在按需工作。

+2

,如果你將文件轉換爲數組會更容易['文件()'](http://php.net/file)和操作數組。 – flowfree

+0

我打算添加文件可以包含1000多行的註釋。因此,將所有文件一次加載到一個數組中將不是最佳的,我認爲。 – DavChana

+0

文件中的所有行是已知長度還是至少已知範圍的可能長度? – DaveRandom

回答

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 
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(); 
    } 
} 
+0

謝謝,按要求工作。我還發現,按照我的答案所做的下列修改使其能夠按需要工作。 – DavChana

+1

啊,現在看到你添加了一個答案。 – hakre

相關問題