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; 
    } 
} 

の終わりを見るまで、あなたが見ることができるように、両方のバージョンが似ている、それだけであなたが必要とするかどうかによって異なり、文字のカウントを保持その後の行かどうか。


\rを検討するあなたがすぐに\n前に1を見たとき、あなたは、例えば、補正することができます

$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前の文字が\rた場合は、真です。したがって、改行を参照して$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個のcharを持っていることです。したがって、fgetc()が十分でないうちに\ nを検索します。ですから、各行には空白行と行末を区別することができません。あなたは私のドラフトに従えますか?よろしく – Otag

+0

私の解決策もうまくいかないことがわかりました。だから私はまだ答えを待っている。よろしくお願いしますOtag – Otag

+0

こんにちは@Olaf Dietsche。私はチェックし、正しいアンサーマークであなたに知らせます。ありがとうございます... – Otag

関連する問題