8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

当(( c = getc(file))!= EOF)循环不会停止执行

max 1月前

27 0

我不明白为什么我的 while 循环不起作用。没有它,代码也能正常工作……代码的目的是在 bin 文件中查找秘密消息。所以我得到了查找字母的代码,但现在……

我不明白为什么我的 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\' 会破坏所有内容。我通过创建一个名为 letter 的新字符,然后将我的代码替换为以下内容来修复它:

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

现在它运行得很好。当然欢迎提出更多建议。谢谢大家。

帖子版权声明 1、本帖标题:当(( c = getc(file))!= EOF)循环不会停止执行
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由max在本站《file》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您还没有告诉我们什么方法不起作用。您得到的结果是什么,您想要得到的结果是什么?这将帮助我们帮助您找到答案。

  • 实际上,keep 应该是一个需要修复的 int。请参阅 JonathanLeffler 的回答。对于 @user1695758,如果 Jonathan 的回答解决了这个问题,请务必接受它。

  • 的返回值 getc() int ,而不是 char .

    getc() 的结果分配给 char ,则当它返回 时,会发生以下两种情况之一 EOF

    • 如果 plain char 是无符号的,那么 EOF 将被转换为 0xFF,并且 0xFF != EOF,因此循环永远不会终止。
    • 如果 plain char 是有符号的,那么 EOF 相当于一个有效字符(在 8859-1 代码集中,即 ÿ、y-umlaut、U+00FF、带有分音符的拉丁小写字母 Y),并且循环可能会提前终止。

    考虑到您面临的问题,我们可以暂时猜测您有 char 一个无符号类型。

    et al 返回 an getc() 的原因 int 是它们必须返回适合 a 的每个可能值 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() 以确保您获得了期望的输入。特别是在输入方面,您真的不能跳过这些检查。迟早会出错,如果您没有认真检查返回状态,您的代码可能会崩溃,或者只是“出错”。

  • 也赞成。建议您明确告诉他如何修复(将 keep 声明为 int),这样就没有理由不接受您的答案。

  • 有 256 个不同的 char 这样的变量 getc() 返回 char 并存储在其中 keep[0] (是的,我总结得太多了)。要可靠地检测文件结尾, EOF 必须有一个不同于所有值的值。这就是为什么 getc() 返回 int 而不是 char :,因为 的第 257 个不同值 EOF 不适合 char .

    因此,您至少需要将返回的值存储 getc() 在其中 int ,直到您对其进行检查 EOF

    int tmpc;
    while( (tmpc = getc(message)) != EOF) {
        keep[0] = tmpc;
        ...
    
  • 或许应该改为 \'... 因为 257 个不同的值无法容纳在 char\' 中。OP 的系统(当然是 Windows)中,带符号的 char 确实包含 EOF,很可能是 -1。它只是无法区分 EOF 和 (char) 255。

返回
作者最近主题: