web-dev-qa-db-ja.com

EOFまでCでfgetsを使用してテキストファイルを読み取る

EOF Cでfgetsを使用するまで)テキストファイルを読み取る正しい方法は何ですか?これで(簡単に)これができました。

char line[100 + 1];
while (fgets(line, sizeof(line), tsin) != NULL) { // tsin is FILE* input
   ... //doing stuff with line
}

具体的には、while条件として他に何かあるべきかどうか疑問に思っていますか?テキストファイルから「行」への解析は、while条件で実行する必要がありますか?

5
Johan

参照 によると

成功すると、関数はstrを返します。文字の読み取りを試みているときにファイルの終わりが検出されると、eofインジケーターが設定されます(feof)。 文字が読み取られる前にこれが発生した場合、返されるポインターはnullポインターです(そしてstrの内容は変更されません)。読み取りエラーが発生すると、エラーインジケーター(ferror)が設定され、nullポインターも返されます(ただし、strが指す内容は変更されている可能性があります)。

そのため、戻り値がNULLかどうかを確認するだけで十分です。また、構文解析はwhile-bodyに入ります。

8
bigahega

あなたがやったことは100%大丈夫ですが、単にテスト自体としてfgetsの戻り値に依存することもできます。

_char line[100 + 1] = "";  /* initialize all to 0 ('\0') */

while (fgets(line, sizeof(line), tsin)) { /* tsin is FILE* input */
    /* ... doing stuff with line */
}
_

どうして? fgetsは、成功した場合はlineへのポインタを返し、失敗した場合は(何らかの理由で)NULLを返します。有効なポインタはtrueをテストします。もちろん、NULLfalseをテストします。

注:line文字配列として宣言されていることを確認する必要がありますin scopeを使用して_sizeof line_を長さとして使用します。lineが単に配列へのポインタの場合、sizeof (char *)文字)

3
David C. Rankin


私は同じ問題を抱えていたので、この方法で解決しました

while (fgets(line, sizeof(line), tsin) != 0) { //get an int value
   ... //doing stuff with line
}
1
user3499663