而((C = GETC(文件))!= EOF)循环将不会停止执行(While (( c = getc

2019-06-21 12:36发布

我想不通,为什么我的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("There was a problem reading the file. \n");
    exit(-1);
}

//the first 4 bytes contain an int that tells how many subsequent bytes you can throw away
fread(&start, sizeof(int), 1, message);
printf("%i \n", start); //#of first 4 bytes was 280
fseek(message, start, SEEK_CUR); //skip 280 bytes
keep[0] = fgetc(message); //get next character, keep it
printf("%c", keep[0]); //print character

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”扔一切都关掉。 我固定它通过创建一个名为信新的焦炭,然后用这个代替我的代码:

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

现在它就像一个魅力。 任何建议是当然欢迎。 感谢大家。

Answer 1:

返回值从getc()和它的亲戚是int ,而不是一个char

如果分配的结果getc()char ,两件事情之一发生时,它会返回EOF

  • 如果普通char是无符号,则EOF被转化为0xFF,到0xFF!= EOF,因此该循环永远不会终止。
  • 如果普通的char被签名,则EOF相当于一个有效的字符(在8859-1代码集,这是Y,Y变音符,U + 00FF,带分音符的拉丁小写字母Y),和你的循环可能会提前终止。

鉴于你所面临的问题,我们可以初步猜测你有普通char为无符号的类型。

其原因getc()等返回一个int是它们具有返回每一个可能的值,可以适合在char ,并且也是不同值,EOF。 在C标准,它说:

ISO / IEC 9899:2011§7.21.7.1的fgetc()函数

int fgetc(FILE *stream);

如果输入流中的结束文件指针指向的stream没有设置和下一个字符存在,则fgetc函数获取字符作为unsigned char转换为int ...

如果用于流结束文件指示符被设置,或者如果流是在文件结束-,用于流的文件结束指示符被设置和fgetc函数返回EOF。

类似的措词适用于getc()函数和getchar()函数:它们被定义为具有如同该fgetc()除了功能如果getc()作为宏被实现,其可以调戏文件流的论点,即是具体而言,流参数表达式可以被评估一次以上,因此调用-通常不授予标准宏getc()有副作用( getc(fp++)是非常傻(但改变fgetc()这将是安全,但仍偏心)。


在你的循环,你可以使用:

int c;

while ((c = getc(message)) != EOF) {
    keep[0] = c;

这保留分配给keep[0] ; 我不知道你真正需要它。

你应该检查其他调用fgets() getc() fread()以确保你得到你所期望的输入内容。 特别是在输入,你不能真正买得起跳过这些检查。 越早,而不是以后,事情会出错,如果你没有宗教检查返回状态,你的代码很可能会崩溃,或者干脆“出错”。



Answer 2:

有256个不同的char可能是由返回值getc()并存储在一个char像变量keep[0]是的,我oversummarising疯狂)。 为了检测档案结尾可靠, EOF必须具有从所有这些不同的价值。 这就是为什么getc()返回int ,而不是char :因为第257个不同的值EOF不会放入一个char

因此,你需要存储返回的值getc()int至少直到你检查它, EOF

int tmpc;
while( (tmpc = getc(message)) != EOF) {
    keep[0] = tmpc;
    ...


文章来源: While (( c = getc(file)) != EOF) loop won't stop executing