2014-02-19 3 views
0

내가 다음과 같은 passwd에 파일을 읽기 위해 PHP 프로그램을 쓰고 있어요 : 여기PHP 코드에서 파일의 EOF가 작동하지 않는 이유는 무엇입니까?

1 misshary:x:1002:1003:Li Han,Li Han,,:/home/misshary:/bin/bash 
    2 testuser:x:1003:1004:test user,,,:/home/testuser:/bin/bash 

을 그리고 나의 코드 :

 $file = fopen("/path/passwd.bak", "r") or exit("Unable to open passwd file!"); 

     while(!feof($file)) 
      { 
       $user_line = fgets($file); 
       $user_array = explode(":", $user_line); 

       echo print_r($user_array)."</br>"; 
      } 

하지만 내가 가진 것은 :

Array ([0] => misshary [1] => x [2] => 1002 [3] => 1003 [4] => Li Han,Li Han,, [5] =>  /home/misshary [6] => /bin/bash) 1 
Array ([0] => testuser [1] => x [2] => 1003 [3] => 1004 [4] => test user,,, [5] => /home/testuser [6] => /bin/bash) 1 
Array ([0] =>) 1 

왜 내가 여분의 배열을 얻었고 추가 배열을 얻었습니까 Array ([0] =>)?

피씨 나는 왜 여분의 1이 뒤따라야하는지 이해한다. 내 질문은 배열이 인쇄 된 세입니다.

답변

1

passwd 파일의 끝에 개행 문자가없는가요? 마지막에 추가 1에 관해서는

print_r 이미 당신은 단지 문서에 따라, 에코

없이 print_r($user_array)."</br>";를 사용해야하는 배열을 인쇄하기 때문에 당신은 print_r

의 결과를 인쇄하고 있기 때문에 :

When the return parameter is TRUE, this function will return a string. Otherwise, the return value is TRUE. 
+0

나는 1이 뒤 따르는 이유를 이해합니다. 제 질문은 왜 세 개의 배열이 인쇄되어있는 것입니까? – harryz

+0

passwd 파일 맨 아래에 빈 줄이 있는지 확인 했습니까? – arcyqwerty

+0

그러면 기본적으로'fgets'가 하나의 요소를 가진 단일 요소 배열로 폭발하는 빈 줄을 반환합니다. – arcyqwerty

0

echo print_r($user_array)을 수행했기 때문에 print_r은 이미 데이터를 인쇄 했으므로 에코를 사용할 필요가 없습니다.

에서 print_r :

반환 매개 변수가 TRUE

,이 함수는 문자열을 반환합니다. 그렇지 않으면 반환 값은 TRUE입니다.

그래서 당신은 사실과 1

로 변환에서 print_r의 결과를, 에코 그리고 당신은 빈 줄을 건너 뛰고 file() 기능을 사용하여 새 라인을 파일에을 무시할 수 :

$lines = file('/path/passwd.bak', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 

if (!$lines) { 
    exit("Unable to open passwd file!"); 
} 

foreach ($lines as $line) { 
    $user_array = explode(":", $line); 
    var_dump($user_array); 
} 
+0

감사합니다. fopen 대신 파일을 사용하면 문제가 해결됩니다. – harryz

관련 문제