fec中错误循环的分析

fec中错误循环的分析,c,feof,C,Feof,我使用下面的代码从文件中读取一个字符并用另一个替换它, 但我在文件结尾处有一个错误.loop 怎么了 我在linux(netbeans IDE)上测试了这段代码,它是正确的,运行得很好,但当我尝试在windows中使用VS2008时,我发现了一个无终止循环 //address = test.txt FILE *fp; fp=fopen(address,"r+"); if(fp == 0) { printf("can not find!!"); } else { char w =

我使用下面的代码从文件中读取一个字符并用另一个替换它, 但我在文件结尾处有一个错误.loop

怎么了

我在linux(netbeans IDE)上测试了这段代码,它是正确的,运行得很好,但当我尝试在windows中使用VS2008时,我发现了一个无终止循环

//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);

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

char w = '0'; /* Wrong, should be int. */
顺便提一下,这一问题在报告中提到

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

编辑

再读一遍你的问题,你寻找两个字符并写一个字符的方式是非常可疑的。这很可能导致无限循环

EDIT2

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

报告说:

对于读取和 允许书写(或追加) (包括“+”符号的),则 应冲洗(fflush)或 重新定位(fseek、fsetpos、倒带) 在读取操作之间 然后是写入操作或 写入操作,后跟 读取操作

我们可以在
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);
}
#包括
int main(int argc,字符**argv)
{
文件*fp;
int w;
fp=fopen(“example.txt”,“w”);
fprintf(fp,“大卫·格雷森”);
fclose(fp);
fp=fopen(“example.txt”,“r+”);
而(1)
{
如果((w=fgetc(fp))!=EOF)
{
如果((w=fgetc(fp))!=EOF)
{
fseek(fp,-2,SEEK_CUR);
fprintf(fp,“0”);
fflush(fp);//必要!
}
}
其他的
{
打破
}
}
fclose(fp);
}

这是在Windows中使用MinGW进行测试的。

为什么不使用feof()函数而不是while(1)loop>,有趣的是,这在Linux中适用。当w为char时,(w=fgetc(f))的类型可能定义不清?好吧,调查一下……我测试了它,但如果我在中使用feof(),它就不起作用了,而如果我有7个字符,那么最后我会有8个字符;如果是“123456”,那么输出是“0000000”,这意味着向输入中添加一个字符。您实际试图通过此循环实现什么?是的,您是正确的…这是问题所在。但解决方案是什么?我测试了您的edit2,在这个循环中,我有一个非结束循环,当我用ctrl+c组合键中断,然后用记事本打开文件时,我看到数以百万计的文件zero@mimad你必须用我发布的内容替换你的整个while。在写和读之间切换时,你可能需要另一个fseek。@David Grayson Fine:-)我自己不喜欢假设太多。
#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);
}