2012-12-04 2 views
2

학교 과제를 위해 나는 PHP로 스크립트를 작성해야합니다. 이름을 가진 배열을 만들고 파일에 배열을 써야합니다. 그런 다음 배열을 삭제하고 파일의 이름을 읽고 echo합니다.PHP의 파일 IO는 작동하지 않습니다.

이 작동하지 않습니다

<?php 
    $names = array("Name 1", "Name 2", "Name 3", "Name 4", "Name 5"); 
    $filename = "names.txt"; 
    $handle = fopen($filename, "wb+"); //open as read and write 
    $string = implode("\r\n", $names); //name on each line 
    fwrite($handle, $string); //write line 

    $names = array(); //empty array 
    print_r($names); //print empty array 
    $string = fread($handle, filesize($filename)); //read file 
    $names = explode("\r\n", $string); //lines to array 
    foreach ($names as $name) { 
     echo("<br>\n$name"); 
    } 
    fclose($handle); 
?> 

하지만이 작동합니다

<?php 
    $names = array("Name 1", "Name 2", "Name 3", "Name 4", "Name 5"); 
    $filename = "names.txt"; 
    $handle = fopen($filename, "wb"); //open as write 
    $string = implode("\r\n", $names); //name on each line 
    fwrite($handle, $string); //write line 
    fclose($handle); //close 

    $handle = fopen($filename, "r"); //open as read 
    $names = array(); //empty array 
    print_r($names); //print empty array 
    $string = fread($handle, filesize($filename)); //read file 
    $names = explode("\r\n", $string); //lines to array 
    foreach ($names as $name) { 
     echo("<br>\n$name"); 
    } 
    fclose($handle); 
?> 

내가하지 않는 내가 닫고 파일을 다시 열 때 작동하는 이유. 어떤 도움을 주시면 감사하겠습니다.

+0

번째 스크립트가없는 제 옳다. – Lobo

+1

전체 fread/filesize/fclose ordeal을 사용하는 것보다'file_get_contents'와'file_put_contents'를 사용하는 것이 훨씬 쉽습니다. –

+0

@ N.B. 제안을 주셔서 감사합니다,하지만 장은 fopen, fwrite 등에 관한 것입니다 – P1nGu1n

답변

8

당신이 필요로 fwrite()를 사용하는 경우 때문에 파일 포인터를 다시 시작하는 것입니다 :

fwrite() 핸들에 의해 파일 스트림이 가리키는 문자열의 내용을 기록합니다.

  • 길이 바이트
  • 을 읽은
  • EOF
  • 패킷이 이용 가능하게하거나 스트림 버퍼링 읽으면 소켓 타임 아웃
  • (네트워크 스트림) 발생 도달 (파일의 마지막) 및 그것은 평범한 파일을 나타내지 않으며, 청크 크기 (일반적으로 8192)와 같은 최대 바이트 수의 읽기가 최대 하나까지 이루어집니다. 이전에 버퍼링 된 데이터에 따라 반환되는 데이터의 크기가 청크 크기보다 클 수 있습니다.

fread()

fread()를 보면 핸들에 의해 참조되는 파일 포인터에서 길이 바이트 까지 읽습니다. 즉시 these conditions 중 하나가 충족 될 때 정지 읽기 :

그래서 시간에 당신이 fread($handle, filesize($filename));를 호출에 당신이 이미 파일
때문에 아무것도의 끝 부분에 표시 할 것입니다.

fseek($handle, 0); 

Yon't이 파일을 닫을 필요가 없습니다 .. 당신의 첫 번째 코드 :

이 그냥 파일

예의 시작 부분에 다시 포인터를 다시 시작 fseek를 사용하여 해결하려면 완벽하게

편집

당신은 또한 당신이수 있습니다 작동합니다PHP DOC에서

파일 스트림의 시작 부분에 핸들의 파일 위치 표시기를 설정합니다.

rewind($handle); 
+0

고마워요! 나는 이제 독서와 작문이 어떻게 작동하는지 더 잘 이해한다. – P1nGu1n

+0

도움을받을 수 있다는 점을 잘 알고 있습니다. – Baba

-2

두 번째 스크립트가 정확합니다. 그 이유는 파일을 쓰기 위해 열면 읽는 데 사용할 수 없으므로 파일을 닫은 다음 다시 읽어야합니다.

+2

-1. 그릇된. w +는 [읽기 및 쓰기] (http://php.net/manual/en/function.fopen.php)이지만 쓰기가 완료되면 파일 포인터는 EOF에 있고 읽을 것이 없습니다. –

관련 문제