c中错误的循环

时间:2011-07-09 08:01:48

标签: c feof

我使用下面的代码从文件中读取一个字符并将其替换为另一个字符, 但是我有一个错误。转到文件末尾。

有什么问题?

我在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);

2 个答案:

答案 0 :(得分:6)

您将fgetc的结果存储在char中,而不是int。

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

顺便提一下,C FAQ中提到了这个问题。

  

如果char类型为unsigned,则为实际值   EOF值将被截断(通过具有   丢弃了高阶位   可能导致255或0xff)和   将不被视为EOF,   导致有效无限   输入

修改

再次阅读你的问题,你寻找两个角色并写一个角色的方式非常可疑。这很可能导致无限循环。

<强> EDIT2

你(可能)想要这样的东西(未经测试):

while ((w = getc(fp)) != EOF) {
    fseek(fp, -1, SEEK_CUR);
    fprintf(fp, "0");
    fflush(fp); /* Apparently necessary, see the answer of David Grayson. */
}

答案 1 :(得分:3)

fopen documentation on cplusplus.com说:

  

对于读取和读取的模式   允许写作(或附加)   (包含“+”符号的那些),   流应该刷新(fflush)或   重新定位(fseek,fsetpos,倒带)   两者之间的阅读操作   然后是写作操作或   写作操作后跟着   阅读操作。

我们可以在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测试的。