2

ファイルから特定の形式の整数を読み取る関数があります。必要に応じて正常に動作しますが、fclose()を使用してファイルを閉じようとすると、fclose()は常にEOFを返します。

なぜ何か提案はありますか?私は学生で、まだ学んでいます。以下にコードを入れました。「処理」コードが必要な場合はお知らせください。ありがとう :)

// Open the file
FILE *myFile = fopen(fileName, "r");
if(myFile == NULL){
    //Handle error
    fprintf(stderr, "Error opening file for read \n");
    exit(1);
}

while(myFile != EOF)
{
     // read and process the file
     // this part works.
}

// always returns EOF here. WHY?
if (fclose(myFile) == EOF) {
    // Handle the error!
    fprintf(stderr, "Error closing input file.\n");
    exit(1);
}
printf("Done reading the file.");

編集:すべての返信ありがとうございます。申し訳ありませんが、これは宿題の一部であるため、コードを投稿できません。私は助けを得ようとしていました、私はあなたたちに私のためにコードを作るように頼んでいません。私の教授によると、コードの投稿は違法です(他の学生が見て、おそらくコピーできるので、それは彼が私に言ったことです)。私は日曜日以降にのみコードを投稿できます。今のところ、コードを変更してfscanfの使用を避けようとします。ありがとう、そして私の謝罪。

4

5 に答える 5

3

これ:

while(myFile != EOF)

実際には違法です(制約違反)。診断を発行するには、準拠するCコンパイラが必要です。gccは、デフォルトでは、単に警告を発行します(これは「診断」と見なされます)。

gccから警告が出された場合は、それに注意を払う必要があります。gccは、IMHOを致命的なエラーとして扱う必要があることについて警告を発することがよくあります。また、警告が表示されなかった場合は、警告を無効にするオプションを使用して呼び出している可能性があります(これは、デフォルトで警告を生成するため、奇妙なことです)。使用するのに適したオプションのセットは次のとおりです-Wall -Wextra -std=c99 -pedantic(または、-std=...必要に応じて、標準の別のバージョンを適用するようにオプションを調整します)。

myFileポインタ型、具体的にはFILE*EOFタイプintはであり、通常はに展開され(-1)ます。ポインタ値を整数値と合法的に比較することはできません(nullポインタ定数の特殊な場合を除きますが、ここでは適用されません)。

プログラムが拒否されないと仮定すると、myFileほぼ確実にに等しくなることはないため、無限ループになると予想されEOFます。

あなたはそれをに変更することができます

while (!feof(myFile))

しかし、それは他の問題を引き起こす可能性があります。ファイルの読み取り中にファイルの終わりを検出する正しい方法は、データの読み取りに使用している関数によって返される値を使用することです。使用している関数のドキュメントを参照して、ファイルの終わりまたはエラー状態が発生したときに何が返されるかを確認してください。このfeof()関数は、読み取りが終了した後、ファイルの終わりまたはエラー状態が発生したかどうかを判別するのに役立ちます

于 2012-08-04T04:57:11.120 に答える
2

読み取り専用モードで開いている通常のファイルに対して、エラーが発生するようなことは何もできないため、fclose表示していないコードにバグがあり、myFile構造を踏みにじっている可能性があります。

また、myFile != EOFfopenのリターンに設定したため、テストが真になることはありません。これにより、テストが実行されることはなく、EOFすでにチェックされてNULLいます。次のような意味ですか。

while((c = fgetc(myFile)) != EOF) {
    // do stuff
}
于 2012-08-04T03:57:26.730 に答える
1

エルノは何と言ったの?これをコードに追加します。

#include <errno.h>
#include <string.h>

if (fclose(myFile) == EOF) {
    // Handle the error!
    fprintf(stderr, "Error closing input file. and errno = %d, and error = %s\n", errno, strerror(errno));
    exit(1);
}

この助けを願っています。

よろしく。

于 2012-08-04T03:54:41.333 に答える
0
while(myFile != EOF)
 {
 // read and process the file
 // this part works.
 }

この部分に問題がなければ、

fclose(myFile);

whileループはmyFile==EOFのみを終了するため(これは間違った比較です。警告を無視しないでください)。EOFはstdio.hファイルで定義されたマクロであるため、glibcによると-1。ループが終了します。これは、myFileポインタがEOFに変更されたことを意味します。これは間違いです。

コードを確認するだけで、ファイルポインタmyFileを変更する必要があります。これは、すべてのファイル操作に使用されるファイル構造を指しているため、上書きしないでください。

ファイルへのポインタであるmyFileは、代入ステートメントの左辺値として使用しないでください。

于 2012-08-04T04:36:03.560 に答える
0

Change while(myFile != EOF){...}bywhile(!feof(myFile)){...}
myFileは、FILE構造体(メモリアドレス)へのポインタです。「ファイルの終わり」のインジケーターではありません。

于 2012-08-04T04:48:57.403 に答える