fec中错误循环的分析
我使用下面的代码从文件中读取一个字符并用另一个替换它, 但我在文件结尾处有一个错误.loop 怎么了 我在linux(netbeans IDE)上测试了这段代码,它是正确的,运行得很好,但当我尝试在windows中使用VS2008时,我发现了一个无终止循环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 =
//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);
}