2011-02-15 8 views
1

파일이 있는데이 파일에서 복사본을 가져오고 싶지 않습니다.동시에 교체하고 읽을 수 있습니까?

그래서 저는 PHP5에서 동시에 바꾸고 싶습니다. 내 머리에서

이 코드는 다음과 같은 것입니다 :

<?php 
$fp = fopen('text', 'rw'); 
while (!feof($fp)) { 
    $line = fgets($fp); 
    $line = "CONVERTED"; 
    fprintf($fp,$line); 
} 
fclose($fp); 
+0

전혀 읽지 않는 이유는 무엇입니까? 질문에 아무런 의미가 없습니다. –

+0

음. 내 가난한 영어에 대한 미안. 나는 명확하게 설명 할 수 없다. 그러나. 나는 tmp 파일을 훔친 파일을 바꾸고 싶다. – freddiefujiwara

+1

왜 tmp 파일에서 악의적입니까? 왜 그걸 피하려고하는거야? –

답변

3

예는 수 개념을하지만, 다른 길이의 컨텐츠와 컨텐츠를 교체하는 경우가 어려울 것이다.

fgetsfprintf은 파일 포인터로 작업합니다. 포인터는 기본적으로 파일에있는 위치입니다. fgetsfprintf을 모두 사용하면 해당 포인터가 앞으로 나아갑니다.

First line 
>Second line 
Third line 

: 당신이 포인터를 라인을 읽고 이동 첫 번째 fgets를 실행 다음

>First line 
Second line 
Third line 

:이 열린 직후 짧은 파일의이 표현을 (> 포인터입니다) 고려 이제 파일에 쓰려고하면 포인터가있는 위치를 씁니다. 내용을 덮어 씁니다. 포인터가에 있는지

First line 
Foobar> line 
Third line 

참고 : 그래서,이 결과가 될 것입니다 당신이 "첫 번째 줄"을 "는 foobar"를 변경하고 (코드에서와 같은) fgets 호출 다음 즉시 작성하려고 말 라인의 중간. 당신이 fprintf를 사용하기 전에 그러나 포인터를 되감기 경우, 올바른 장소에

인쇄됩니다 :

교체 라인이 원본과 크기가 다를 경우 것 같은이, 작동하지 않습니다
<?php 
$fp = fopen('text', 'rw'); 
while (!feof($fp)) { 
    $line = fgets($fp); 
    fseek($fp, -strlen($line), SEEK_CUR); 
    // length has to be identical to string you replaced 
    $line = "FoobarLine"; 
    fprintf($fp,$line); 
} 
fclose($fp); 
?> 

주 그렇지 않아야하는 데이터를 덮어 쓰거나 잘못된 위치에서 읽기 시작할 수 있습니다.


더 나은 솔루션은 다음과 같습니다

  • 파일이 충분히 작은 경우; file을 사용하여 줄 단위로로드하고 배열을 원하는대로 수정 한 후 file_put_contents(implode("\n", $array)을 사용하여 덮어 씁니다.
  • 임시 파일을 사용하기 만하면됩니다. 별로 중요하지 않습니다.
관련 문제