首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >第一行后到达EOF的标准输入

第一行后到达EOF的标准输入
EN

Stack Overflow用户
提问于 2019-07-09 02:40:40
回答 1查看 143关注 0票数 0

我正在尝试使用type file.txt | myprogram.exe通过管道将文件传送到我的程序。我是这样读的:

代码语言:javascript
复制
char *line;
struct block *newblock, *cur;
int i, osl, cbs, rs;
int startblock;

/* read in the blocks ... */
while (!feof(stdin) && !ferror(stdin)) {
    cbs = 2048;
    line = (char *)malloc(cbs + 1);
    if (!line) {
        perror("malloc");
        exit(1);
    }
    line[cbs] = '\0';

    /* read in the line */
    if (!fgets(line, cbs, stdin)) {
        free(line);
        continue;
    } else {
        while (line[cbs - 2]) {
            /* expand the line */
            line = (char *)realloc(line, (cbs * 2) + 1);
            if (!line) {
                perror("realloc");
                exit(1);
            }
            line[cbs * 2] = '\0';

            /* read more */
            if (!fgets(line + cbs - 1, cbs + 1, stdin))
                break;

            cbs *= 2;
        }
    }
    ...
}

但就在读取第一行之后,即使文件中有多行,feof()也会返回true。这怎么会发生呢?

EN

回答 1

Stack Overflow用户

发布于 2019-07-09 02:59:34

代码有多个问题:

  • 文件结尾测试不正确:feof()仅在读取函数失败后提供有意义的信息。
  • 重新分配方案已中断:您测试了数组的倒数第二个字节,但如果行较短,则fgets()可能未设置此字节。

下面是修复程序的方法:

如果您的系统支持getline()

  • 也可以使用它。getline()分配足够大的缓冲区,以便一次读取一行。
  • 或使用fgets读取行片段并检查它是否以换行符结尾。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56940826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档