c中的一个错误循环



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

怎么了?

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

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

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

顺便说一下,这个问题在C FAQ中提到过。

如果类型charunsigned,则实际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. */
}

cplusplus.com上的fopen文档说:

用于同时读取和允许书写(或追加)(包含"+"号的)流应该被冲洗(fflush)或重新定位(fseek, fsetpos, rewind)在读操作之间之后是写操作或写操作后接a阅读操作。

我们可以在fprintf之后添加一个fflush调用来满足这个要求。

这是我的工作代码。它创建一个名为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);
}

相关内容

  • 没有找到相关文章

最新更新