5

cでファイルを読み込もうとしています。.txtファイルがあり、その内容が含まれています。

file_one.txt file_two.txt file_three.txt file_four.txt

fopenでこのファイルを読み込もうとすると、次の出力が得られます。

file_one.txt file_two.txt file_three.txt file_four.txt \ 377

\ 377はどういう意味ですか?これが私のコードです。

    #include <stdio.h>

    #include <stdlib.h>

    int main(int argc, const char * argv[]){

        FILE *filelist;

        char ch;

        filelist=fopen("file-path", "rt");

        while (!feof(filelist)) {
            ch = getc(filelist);
            printf("%c",ch);
        }

        fclose(filelist);

        return 0;
    }
4

2 に答える 2

13

これ\377は、8進数のエスケープシーケンス、10進数の255、すべてのビットが設定されています。EOFこれは、通常は値を持つ-をに-1変換することからchar生じます。

while (!feof(filelist)) {

feof(filelist)ファイルを読み越して読み取ろうとした後にのみtrueになります。

したがって、ファイルの最後でもう一度ループに入り、をgetc()返しますEOF

于 2012-12-11T23:40:36.747 に答える
13

このgetc()関数は、タイプintではなく、タイプの結果を返しますchar。あなたchar ch;はする必要がありますint ch;

なぜそれが返されるのintですか?返される値は、読み取ったばかりの文字(に変換されたもの)または入力エラーまたはファイルの終わりの状態を示す特別な値(通常は-1)のいずれかであるためです。unsigned charintEOF

feof()入力の終了を検出するためにこの関数を使用しないでください。入力がなくなったにのみtrueを返します。への最後の呼び出しgetc()はを返します。これは、オブジェクトEOFに格納されると、に変換されます。これは通常、です。char(char)-1'\377'

もう1つの問題は、入力エラーが発生した場合に真の値feof()を返さないことです。その場合、ferror()trueを返します。を使用feof()および/または返品ferror() に、なぜ返品したかを示します。getc()EOFEOF

ファイルの最後に到達するまでファイルから読み取るには:

int ch;
while ((ch = getc(filelist)) != EOF) {
    /* ch contains the last character read; do what you like with it */
}

推奨読書:comp.lang.cFAQのセクション12 。

于 2012-12-11T23:41:17.973 に答える