0

私はPHPにかなり慣れておらず、Cで行ったことを変換しようとしています。教えられたCのファイルから読み取るためのイディオムは次のとおりです。

while ((c = getchar()) != EOF) {
    doSomethingWith(c);
}

私はいくつかの読書をしました、そしてそれをPHPでこれをする「正しい」方法は次のように思われるでしょう:

while (!feof($file)) {
    $c = fgetc($file);
    doSomethingWith($c);
}

私の質問は次のとおりです:次のように2つを組み合わせても大丈夫ですか(私はそれを試しましたが、テストファイルで問題なく動作します)、またはこれがEOFの前にnullを見つける可能性がある状況はありますか?:

while (($c = fgets($f)) != null) {
    doSomethingWith($c);
}

よろしくお願いします

スティーブ

4

2 に答える 2

2

それは大丈夫ですが、あなたがそれをしている方法は間違っています(少なくとも「まったく正しくない」)。ファイルの終わりに達した場合はをfgets()返します。したがって、代わりにテストする必要があります。ブール値と比較する場合、「単純な」等式演算子()を使用するため、これは機能します。falsefalse==nullfalse

ハンドルが指すファイルから読み取られた最大1バイトの文字列を返します。ファイルポインタで読み取るデータがこれ以上ない場合は、FALSEが返されます。

エラーが発生した場合、FALSEが返されます。

つまり、次のように見える必要があります

while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}
于 2011-06-23T10:23:52.513 に答える
0

fgetsfalse読み取るデータがなくなったときに返されるように文書化されています。したがって、技術的に正しい解決策は次のようになります。

// Notice the !== [non-identical] operator below
while (($c = fgets($f)) !== false) {
    doSomethingWith($c);
}

これはfgets、空の(長さがゼロの)文字列を合法的に返す可能性があるため、より優れています。これはnull、等式演算子を使用した場合と同等に比較されます。演算子はそのオペランドのタイプ!==もチェックするので、この方法でカバーされます。

于 2011-06-23T10:24:41.207 に答える