问题描述
我不知道为什么我的while循环不起作用。代码工作正常没有它...代码的目的是在bin文件中找到一个秘密消息。所以我得到了代码来找到这些字母,但现在当我试图让它循环直到文件结束时,它不起作用。我是新的我做错了什么?main(){
FILE * message;
int i,start;
long int size;
char keep [1];
message = fopen(c:\\myFiles\\Message.dat,rb);
if(message == NULL){
printf(读取文件时出现问题\\\
);
exit(-1);
}
//前4个字节包含一个int,表示可以丢弃多少个后续字节
fread(& start,sizeof(int),1,message );
printf(%i \\\
,start); //前4个字节的数目是280
fseek(message,start,SEEK_CUR); // skip 280 bytes
keep [0] = fgetc(message); //获取下一个字符,保持
printf(%c,keep [0]); //打印字符
while((keep [0] = getc(message))!= EOF){
fread(& start,sizeof(int),1,message);
fseek(message,start,SEEK_CUR);
keep [0] = fgetc(message);
printf(%c,keep [0]);
}
fclose(message);
system(pause);
}
编辑:
在调试器中查看我的代码之后,它看起来像在while循环中的getc抛出了一切。我通过创建一个新的char函数来修复它,然后用以下代码替换代码:
fread(& start,sizeof (int),1,message);
fseek(message,start,SEEK_CUR);
while((letter = getc(message))!= EOF){
printf(%c,letter);
fread(& start,sizeof(int),1,message);
fseek(message,start,SEEK_CUR);
}
它现在就像一个魅力。任何更多的建议当然欢迎。感谢大家。
来自 getc()的返回值及其亲属是一个 int ,而不是一个 char 。
如果您将 getc()的结果分配给 char ,则返回 EOF :
- 如果简单 char 是无符号的,那么EOF被转换为0xFF,0xFF!= EOF,所以循环永远不会终止。
- 如果简单 char 那么EOF相当于一个有效的字符(在8859-1代码集中,这是ÿ,y-umlaut,U + 00FF,LATIN SMALL LETTER Y WITH DIAERESIS),你的循环可以提前终止。
鉴于您遇到的问题,我们可以暂时猜测您将 char 作为无符号类型。
getc()等返回一个 int 他们必须返回可以适合 cha的每一个可能的值r ,还有一个不同的值EOF。在C标准中,它说:
Similar wording applies to the getc() function and the getchar() function: they are defined to behave like the fgetc() function except that if getc() is implemented as a macro, it may take liberties with the file stream argument that are not normally granted to standard macros — specifically, the stream argument expression may be evaluated more than once, so calling getc() with side-effects (getc(fp++)) is very silly (but change to fgetc() and it would be safe, but still eccentric).
In your loop, you could use:
int c; while ((c = getc(message)) != EOF) { keep[0] = c;
This preserves the assignment to keep[0]; I'm not sure you truly need it.
You should be checking the other calls to fgets(), getc(), fread() to make sure you are getting what you expect as input. Especially on input, you cannot really afford to skip those checks. Sooner, rather than later, something will go wrong and if you aren't religiously checking the return statuses, your code is likely to crash, or simply 'go wrong'.
这篇关于while((c = getc(file))!= EOF)循环不会停止执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!