2016-11-20 58 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,例如前补偿

$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 ...我遇到的问题是,每一行最后都有一个\ n字符,无论它是\ r \ n还是单个\ n的形式。因此,寻找\ n而fgetc()是不够的。所以,因为在每一行中都有\ n我无法区分空行和行尾。你能遵循我的草稿吗?问候 – Otag

+0

我刚刚发现我的解决方案也无法正常工作。所以我仍在等待答案。问候Otag – Otag

+0

你好@Olaf Dietsche。我会检查并通过正确的答案标记告诉你。谢谢你... – Otag

相关问题