2012-06-10 3 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 루프를 끝내는 것입니다.

원하는 출력은 다음과 같습니다 주사위 2 때마다, 텍스트가 이전과 동일하다는 것을

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 = 1의 첫 번째 발생에서 멈추고 있습니다.

기본적으로 제 질문은 파일 포인터를 이전 행으로 이동/재배치하는 방법입니다.

dice = rand (1,2)는 단지 예입니다. 실제 코드에서 $ text는 문자열이고 string이 특정 텍스트를 포함하지 않을 때 조건이 참인 경우입니다.

EDIT : 원하는 해결 두 샘플 (@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. 시나리오 I에 대한 더 나은 인터페이스를 제공하는 대한 SplFileObject를 사용하는 고려 다음 줄 만 앞으로 파일에서 행을 읽을 수 있지만 '말 D : 필요에 따라이 샘플도 노력하고 있습니다

$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