c -从stdin读取文本文件在最后一行停止



我写了一个小程序来测试从stdin读取文本文件:

int main(){
    char c;
    while(!feof(stdin)){
        c = getchar();       //on last iteration, this returns 'n'
        if(!isspace(c))      //so this is false
            putchar(c);
        //remove spaces
        while (!feof(stdin) && isspace(c)){    //and this is true
                c = getchar();  //      <-- stops here after last n
                if(!isspace(c)){
                    ungetc(c, stdin);
                    putchar('n');
                }
        }
    }
    return 0;
}

然后传递给它一个小文本文件:

jimmy   8
phil    6
joey    7

,最后一行(joey 7)以n字符结尾。

我的问题是,在它读取并打印最后一行之后,然后循环检查是否有更多的输入,没有更多的字符要读取,它只是停在代码块中标记的行。

问题:feof()返回true的唯一方法是在读取失败后,如这里所述:在c中检测EOF。为什么不最终调用getchar触发EOF,我如何更好地处理此事件?

你的代码中有多个问题:

  • 您没有包含<stdio.h>,也没有包含<ctype.h>,或者至少您没有发布整个源代码。
  • 您使用feof()来检查文件结束。这几乎从来都不是正确的方法,正如为什么"while (!feof (file))"总是错误的那样?
  • char变量的流中读取字节。这妨碍了对EOF的正确测试,也导致了isspace(c)的未定义行为。将类型更改为int

这是一个改进的版本:

#include <stdio.h>
int main(void) {
    int c;
    while ((c = getchar()) != EOF) {
        if (!isspace(c)) {
            putchar(c);
        } else {
            //remove spaces
            while ((c = getchar()) != EOF && isspace(c)) {
                continue;  // just ignore extra spaces
            }
            putchar('n');
            if (c == EOF)
                break;
            ungetc(c, stdin);
        }
    }
    return 0;
}

虽然ungetc()的方法在功能上是正确的,但最好这样使用辅助变量:

#include <stdio.h>
#include <ctype.h>
int main(void) {
    int c, last;
    for (last = 'n'; ((c = getchar()) != EOF; last = c) {
        if (!isspace(c)) {
            putchar(c);
        } else
        if (!isspace(last))
            putchar('n');
        }
    }
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新