2016-11-20 12 views

답변

1

버퍼의 현재 줄 문자를 수집 한 다음 줄 끝이 보일 때 셀 수 있습니다. 당신이 볼 수 있듯이

$buffer = ''; 
while (($char = fgetc($fp)) !== false) { 
    if ($char != '\n') { 
     $buffer .= $char; 
    } else { 
     if (strlen($buffer) == 0) { 
      echo "Empty line\n"; 
     } else { 
      echo "Non-empty line\n"; 
     } 

     $buffer = ''; 
    } 
} 

또는 당신이 읽는 동안 당신이 라인의 끝을 볼 때까지, 문자의 수를 유지

$count = 0; 
while (($char = fgetc($fp)) !== false) { 
    if ($char != '\n') { 
     ++$count; 
    } else { 
     if ($count == 0) { 
      echo "Empty line\n"; 
     } else { 
      echo "Non-empty line\n"; 
     } 

     $count = 0; 
    } 
} 

, 두 버전이 유사, 그것은 단지 당신이 필요 여부에 따라 달라집니다 이후에 라인.


당신이 즉시 \n, 예를 들어, 전에 하나를 볼 때 \r을 고려하려면 보상 할 수 이전 문자가 \r 인 경우

$cr = false; 
$count = 0; 
while (($char = fgetc($fp)) !== false) { 
    if ($char != '\n') { 
     $cr = false; 
     ++$count; 
     if ($char == "\r") 
      $cr = true; 
    } else { 
     if ($cr) 
      --$count; 

     if ($count == 0) { 
      echo "Empty line\n"; 
     } else { 
      echo "Non-empty line\n"; 
     } 

     $count = 0; 
    } 
} 

$cr는 사실이다. 따라서 개행 문자를보고 $cr이 참이면 CRLF이고 문자 수가 1 씩 감소합니다.

대안으로 전체 라인을 수집 할 수 있습니다 및

요청하지 비록
if (strlen(trim($buffer)) == 0) { 
    echo "Empty line\n"; 
} else { 
    echo "Non-empty line\n"; 
} 

, 전체 라인과 검사를 읽는 것은, 예를 들어,보다 효율적으로 할 수있는 길이보기 전에 공백을 잘라

while (($buffer = fgets($fp)) !== false) { 
    if (strlen(rtrim($buffer, "\n")) == 0) { 
     echo "Empty line\n"; 
    } else { 
     echo "Non-empty line\n"; 
    } 
} 
+0

안녕하세요, 당신에게 @Olaf DIETSCHE 감사 ... 나는 발생한 문제는 모든 라인 그것이 \ r에 \ n 또는 하나의 \ n의 형태이든 끝에 \ n 개의 문자를 가지고 있다는 것입니다. 따라서 fgetc()가 충분하지 않을 때 \ n을 검색합니다. 그래서 각 줄에는 \ n이 있습니다. 빈 줄과 줄 끝을 구별 할 수 없습니다. 내 초안을 따라갈 수 있습니까? 감사합니다 – Otag

+0

방금 ​​내 솔루션도 작동하지 않는다는 것을 알았습니다. 그래서 나는 아직도 대답을 기다리고있다. 감사합니다 Otag – Otag

+0

안녕하세요 @Olaf Dietsche. 확인하고 정답 마크를 알려 드리겠습니다. 고맙습니다 ... – Otag