4

以下のコードを使用してファイルからcharを読み取り、別のcharに置き換えますが、ファイルの終わりに行くときにerror.loopが発生します。

なにが問題ですか?

このコードをLinux(netbeans IDE)でテストしたところ、正しく機能していましたが、WindowsでVS 2008を使用しようとすると、非終了ループが見つかりました。

//address = test.txt

FILE *fp;
fp=fopen(address,"r+");
if(fp == 0)
{
    printf("can not find!!");
}
else
{
    char w = '0';  /// EDIT : int w;
    while(1)
    {
        if((w = fgetc(fp)) != EOF)
        {
            if((w = fgetc(fp)) != EOF)
            {
                fseek(fp,-2,SEEK_CUR);
                fprintf(fp,"0");
            }
        }
        else
        {
            break;
        }
    }
} 
fclose(fp);
4

2 に答える 2

6

fgetcint ではなく char に結果を格納しています。

char w = '0'; /* Wrong, should be int. */

ちなみに、この問題はC FAQに記載されています。

typecharunsignedの場合、実際の EOF 値は切り捨てられ (上位ビットが破棄され、おそらく 255 または 0xff になります)、EOF として認識されず 、実質的に無限の inputになります。

編集

あなたの質問をもう一度読んでみると、2 つの文字を検索して 1 つの文字を書く方法は非常に怪しいです。それは無限ループにつながる可能性があります。

EDIT2

あなたは(おそらく)このようなものを望んでいます(テストされていません):

while ((w = getc(fp)) != EOF) {
    fseek(fp, -1, SEEK_CUR);
    fprintf(fp, "0");
    fflush(fp); /* Apparently necessary, see the answer of David Grayson. */
}
于 2011-07-09T08:04:53.137 に答える
3

cplusplus.comのfopen ドキュメントには次のように書かれています。

読み取りと書き込み (または追加) の両方が許可されているモード (「+」記号を含むモード) の場合、ストリームは、読み取り操作とその後の書き込み操作、または書き込み操作とそれに続く読み取り操作。

その要件を満たすためfflushに、 の後に呼び出しを追加できます。fprintf

これが私の作業コードです。という名前のファイルを作成しexample.txt、プログラムが終了した後、そのファイルの内容は000000000000n.

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE * fp;
    int w;

    fp = fopen("example.txt","w");
    fprintf(fp, "David Grayson");
    fclose(fp);

    fp = fopen("example.txt","r+");
    while(1)
    {
        if((w = fgetc(fp)) != EOF)
        {
            if((w = fgetc(fp)) != EOF)
            {
                fseek(fp,-2,SEEK_CUR);
                fprintf(fp,"0");
                fflush(fp);  // Necessary!
            }
        }
        else
        {
            break;
        }
    }
    fclose(fp);
}

これは、Windows の MinGW でテストされました。

于 2011-07-09T08:50:56.707 に答える