2010-07-13 3 views
6

저는 C 및 C++ 배경에서 왔지만 일부 웹 기능도 가지고 있습니다. 우리 모두는 C가 (잘하면) 읽을 것을하기 전에 feofFILE*에두고 있다는 것을 알고 있습니다. 이것은 초보자를 C와 C++에 자주 붙잡는 것입니다. 이것은 PHP의 구현에서도 마찬가지입니까?PHP의 feof 동작 대 C의

필자는 파일이 소켓이나 읽는 것을 끝내기 전에 크기를 알 수없는 다른 것일 수 있다는 것을 알았습니다. 그러나) 거의 모든 PHP 예제 (내가 본 php.net에서 발견 심지어는 다음과 같이 보이는 (알람은 내 머리에서 떨어져 이동 :

$f = fopen("whatever.txt", "rb"); 
while(!feof($f)) { 
    echo fgets($f); 
} 
fclose($f); 

내가 이렇게이를 작성하고이를 방지하는 것이 바람직하다 알고 문제 :

$f = fopen("whatever.txt", "rb"); 
while($line = fgets($f)) { 
    echo $line; 
} 
fclose($f); 

하지만 "잘못된 방법"을 한 경우에 일을 실패,하지만 난 그게 잘못된 동작이 발생할 얻을 수없는 경우 그 점 외에 내가 테스트를 시도의이 정확하게 과학적하지 않습니다.. 하지만 그럴 가치가 있다고 생각했습니다.

PHP에서 fread보다 먼저 feof을 부르는 것이 올바르지 않습니까?

PHP가 C의 버전과 다르게 할 수 있었던 몇 가지 방법이 있지만 나는 그들이 단점이 있다고 느낍니다.

  • 기본값은! EOF 일 수 있습니다. 일부 모서리의 경우 올바르지 않을 수 있기 때문에 차선책입니다.

  • 그들이 fopen 통화 중에 파일 크기를 얻을 수 있지만이 일치하지 않는 행동을 산출, 파일 자원의 모든 유형에서 작동하지 않을 수 있고 느린 것입니다.

답변

3

PHP는 파일을 읽으 려 할 때까지 파일의 끝에 있는지 여부를 알지 못합니다. 이 간단한 예를 시도해보십시오.

<?php 
$fp = fopen("/dev/null","rb"); 
while (!feof($fp)) { 
    $data = fread($fp, 1); 
    echo "read " . strlen($data) . " bytes"; 
} 
fclose($fp); 
?> 

한 줄에 read 0 bytes이 표시됩니다. feof()는 기술적으로 파일의 끝에 있었지만 true를 반환했습니다. fread($fp, 1)은 아무 데이터도 반환하지 않으므로 일반적으로 문제가 발생하지 않으며 처리중인 모든 처리가 아무런 데이터도 처리하지 않습니다. 파일의 끝에 있는지 실제로 알 필요가 있다면 먼저 읽어야합니다.

-1

fread이 올바르지 않기 전에 을 부르지 말라는 귀하의 주장 - 결과적으로 질문이 유효하지 않습니다.

+5

이 귀중한 공헌을하기 위해 계정을 만드셨습니까? –

+0

C에서 EOF 플래그를 설정할 수있는 연산 전에'feof'를 호출하는 것이 가장 확실한 논리적 오류입니다. 'fopen'은 그러한 작업 중 하나가 아닙니다. –

+0

Arrrggghhh! 그것은 논리적, 구문 론적, 또는 그 밖의 오류가 아니라는 것이 가장 확실합니다. 그것은 완벽하게 유효합니다. 그것이 무엇을하는지 이해한다면 위의 MightyE가 설명했던대로 예상대로 작동합니다. 질문은 조건을 오류로 구성했습니다. 그렇지 않습니다. – Anonymous

0

답변보다 질문 일 수는 있지만 file_get_contents()을 사용하지 않으시겠습니까? 내 경험에 의하면 파일이나 스트림을 읽는 경우이 함수는 더러운 작업을 수행합니다 (전체 리소스를 문자열로 읽거나 제한 및 오프셋을 알고/계산할 수 있다고 가정). 자매 함수 인 file_put_contents()는 반대로 잘 작동합니다.

$expected_content = "Hello Stack Overflow!" 
$real_content = file_get_contents("/path/to/file.txt"); 
if ($expected_content != $real_content){ 
    file_put_contents("/path/to/file.txt", $real_content); 
} 

또는 스트림 : 예를 들어

가 여기 예입니다 당신을 위해 그것을 않습니다, 그리고

$expected_content = "Hello Stack Overflow!" 
$real_content = file_get_contents("http://host.domain.com/file.txt"); 
if ($expected_content != $real_content){ 
    $options = array('ftp' => array('overwrite' => true)); 
    $stream = stream_context_create($options); 
    file_put_contents("ftp://user:[email protected]/file.txt", $real_content, 0, $stream); 
} 

당신이 EOF 또는 아무것도에 대해 걱정할 필요가 없습니다 (ftp를 넣어 약간 dicey를 얻는다. 그러나 그것은 ok 다). 물론 이것은 모든 상황에서 작동하지 않을 것입니다 ...

이 접근법을 실현할 수없는 원래의 질문에서 빠진 것이 있습니까?

+1

당신의 접근 방식은 훌륭하고 완전히 합리적입니다. 제 질문은 실제보다 학문적입니다. PHP에서'foef'가 C에서와 같은 행동을하는지 알고 싶었습니다. 고마워요. –

+1

아, 학자, 트위드 팔꿈치가 달린 가죽 자켓을 보지 못했습니다. (호머 심슨 FTW, "CORRECTION, 나는 두 개의 재킷을 망 쳤어!") – Tim