1

私は(リンクテキストから)のようなプログラムを持っています

FILE* soubor;
char buffer[100];
soubor = fopen("file","r");
string outp = "";
while (! feof(soubor))
{
        fgets(buffer,100,soubor);
        fputs (buffer , stdout);
}
fclose(soubor);

とファイルのように

A
B
C
D
E

プログラムの出力は

A
B
C
D
E
E

ファイルの最後の行を2回繰り返します。私は他のプログラムでもこの問題を抱えています。

4

4 に答える 4

7

ループがファイルから読み取るための条件として使用feof()すると、ほとんどの場合、問題が発生します。標準的な方法は次のようになります。

while (fgets(buffer, 100, infile))
    fputs(buffer, stdout);
于 2009-10-29T17:48:22.610 に答える
7

問題は、最後の行でfgetsが失敗することです。ただし、次のループまでfeofをチェックしていないため、fputsを呼び出して、バッファーの内容、つまり前の行を出力します。

これを試して:

FILE* soubor;
char buffer[100];
soubor = fopen("file","r");
string outp = "";
while (true)
{
  fgets(buffer,100,soubor);
  if (feof(soubor))
    break;
  fputs (buffer , stdout);
}
fclose(soubor);
于 2009-10-29T10:41:03.333 に答える
0

私はベンラッセルの答えが好きです。これは、cコードの最後の行を繰り返さないようにするための私のバージョンです。それは動作しますが、それがこの動作を行う必要がある条件のため、理由はわかりません if (fgets != NULL)

int main ()
{
    FILE* pFile;
    char name[41] = "fileText04.txt";
    char text[81];
    int i;

    pFile = fopen("fileText04.txt", "wt");
    if (pFile == NULL)
    {
        printf("Error creating file \n");
        exit(1);
    }
    else
    {
        for (i=0; i<5; i++)
        {
            printf("Write a text: \n");
            fgets(text, 81, stdin);
            fputs(text, pFile);
        }
    }
    fclose (pFile);
    pFile = fopen(name, "rt");
    if (pFile == NULL)
    {
        printf("File not found. \n");
        exit(2);
    }
    while (! feof(pFile))
    {
        fgets(text, 80, pFile);
        if (feof(pFile))   // This condition is needed to avoid repeating last line.
            break;         // This condition is needed to avoid repeating last line.
        if (fgets != NULL)
            fputs(text, stdout);
    }
    fclose (pFile);
    return 0;
}

どうもありがとう、ハイメ・ダヴィウ

于 2014-05-27T12:56:51.470 に答える
0

feof(inputfile_pointer)がファイルのコピー時に終了をチェックする正しい方法ではない理由は、次の両方の状況で機能しないためです。

  1. ファイルは改行文字なしで終了します。
  2. ファイルは改行文字で終わります。

証拠:

  • が後、ただし前にfeofチェックされていると仮定します。その場合、上記のケース1では機能しません。EOFの前に読み取られる文字はすべて、によって使用されないためです。fgets()fputs()fgets()fputs()
  • の後、ただし前にfeofチェックされていると仮定します。次に、上記のケース2では機能しません。最後にEOFに遭遇したときに、バッファ文字列を新しいもので上書きせず、もう一度実行できるように、バッファ文字列と同じ内容を出力ファイルに入れます。前の反復のように; したがって、出力ファイルの最後の行を繰り返します。fputs()fgets()fgets()fputs()
于 2017-10-29T16:40:54.623 に答える