1. ホーム
  2. c

[解決済み] C言語でテキストファイルを実行するためにEOFを使用するにはどうすればよいですか?

2022-03-02 01:39:29

質問

各行に文字列を記述したテキストファイルがあります。テキストファイルの各行ごとに番号をインクリメントしたいのですが、ファイルの終端に到達したら明らかに停止する必要があります。EOFについて少し調べてみましたが、適切な使い方がよくわかりませんでした。

whileループが必要だと思うのですが、どうすればいいのかわかりません。

どのように解決するのですか?

EOFをどのように検出するかは、ストリームの読み取りに何を使っているかによります。

function                  result on EOF or error                    
--------                  ----------------------
fgets()                   NULL
fscanf()                  number of succesful conversions
                            less than expected
fgetc()                   EOF
fread()                   number of elements read
                            less than expected

入力呼び出しの結果、上記の適切な条件をチェックし feof() で、その結果がEOFにぶつかったためなのか、それとも他のエラーなのかを判断します。

使用方法 fgets() :

 char buffer[BUFFER_SIZE];
 while (fgets(buffer, sizeof buffer, stream) != NULL)
 {
   // process buffer
 }
 if (feof(stream))
 {
   // hit end of file
 }
 else
 {
   // some other error interrupted the read
 }

使用方法 fscanf() :

char buffer[BUFFER_SIZE];
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion
{
  // process buffer
}
if (feof(stream)) 
{
  // hit end of file
}
else
{
  // some other error interrupted the read
}

使用方法 fgetc() :

int c;
while ((c = fgetc(stream)) != EOF)
{
  // process c
}
if (feof(stream))
{
  // hit end of file
}
else
{
  // some other error interrupted the read
}

使用方法 fread() :

char buffer[BUFFER_SIZE];
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 
                                                     // element of size
                                                     // BUFFER_SIZE
{
   // process buffer
}
if (feof(stream))
{
  // hit end of file
}
else
{
  // some other error interrupted read
}

形式はどれも同じであることに注意してください。読み出し操作の結果を確認し、失敗した場合は では はEOFをチェックします。 というような例をよく見かけると思います。

while(!feof(stream))
{
  fscanf(stream, "%s", buffer);
  ...
}

このフォームは、人々が考えているようには機能しないのです。 feof() を実行するまで真を返しません。 の後に ファイルの最後を読もうとしたときです。 その結果、ループは1回多く実行され、あなたを苦しめるかもしれないし、そうでないかもしれません。