意外的getc(stdin)等待在EOF之前读取文件的最后一个字符

时间:2018-04-27 14:43:03

标签: c io eclipse-cdt

我的应用程序是使用Eclipse CDT Neon(4.6.2RC3)和gcc(Debian 6.3.0-18)6.3.0 20170516构建的

#include <stdio.h>
#include <stdlib.h>

int
main()
{
    for (int i = 0;;i++) {  /* Loop through characters. */
        int ch;
        ch = getc(stdin);   /* Read the next character. */
        if (i < 100 || i > 67730) fprintf(stderr, "%i(%i) ", i, ch);
        else if (i == 100) fprintf(stderr, " ----- ");
        if (ch == EOF)
            break;      /* Exit loop on end-of-file. */ 
    }
    fprintf(stderr, "\n\n*** finished successfully ***\n");
    return 0;
}

以下是我的编译选项:-O0 -pedantic -Wall -Wextra -c -ggdb -fmessage-length=0 -Wno-implicit-function-declaration。我是在管道传输到stdin的输入文件的帮助下运行的。

当我从控制台运行它时,一切都很好。这是从控制台运行时正常输出的结束:

./myprogram < inputfile.pdf

67825(32) 67826(54) 67827(10) 67828(10) 67829(12) 67830(-1) 

*** finished successfully ***

但是当我从Eclipse CDT以调试模式运行它时,它会在EOF(67830th)之前的最后一个字符(67829th)无限期等待,程序永远不会退出。如果我暂停执行,我可以检查它是否被卡在ch = getc(stdin);行内。这是此时的堆栈:

Thread #1 [ArithmeticCoder] 29598 [core: 5] (Running : User Request)    

Thread #1 [myprogram] 29598 [core: 6] (Suspended : Signal : SIGINT:Interrupt)   
    __read_nocancel() at /build/glibc-p3Km7c/glibc-2.24/io/../sysdeps/unix/syscall-template.S:84 0x7ffff7811700 
    _IO_new_file_underflow() at /build/glibc-p3Km7c/glibc-2.24/libio/fileops.c:600 0x7ffff77a9a00   
    __GI__IO_default_uflow() at /build/glibc-p3Km7c/glibc-2.24/libio/genops.c:413 0x7ffff77aab02    
    _IO_getc() at /build/glibc-p3Km7c/glibc-2.24/libio/getc.c:38 0x7ffff77a54f0 
    main() at /.../WorkSpace/myprogram/src/myprogram.c:20 0x555555554f08    

我试过了:

  • fgetc非常相似,但结果相同。
  • Eclipse CDT RUN模式下,它没有到达文件的末尾。我认为问题是相同的,并且是由于在 Eclipse CDT 环境下运行此应用程序。
  • ch = getc(stdin); if (ch == EOF)替换int s = fread (&ch, 1, 1, stdin ); if (ch == EOF || s == 0),结果是一样的!我没想到,因为他们的行为确实不同。

我的设置可能会出现什么样的错误?

请问好吗?

0 个答案:

没有答案