提问人: 提问时间:7/9/2019 最后编辑:chqrlie 更新时间:7/9/2019 访问量:213
stdin 在一线后到达 EOF
stdin reaching EOF after first line
问:
我正在尝试使用 .我正在阅读它:type file.txt | myprogram.exe
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;
}
}
...
}
但是在读取第一行之后,即使文件中有多行,也会返回 true。怎么会这样呢?feof()
答:
1赞
chqrlie
7/9/2019
#1
该代码存在多个问题:
- 文件末尾测试不正确:仅在读取函数失败后提供有意义的信息。
feof()
- 重新分配方案被破坏:您测试数组的倒数第二个字节,但如果该行较短,则可能没有设置此字节。
fgets()
以下是修复程序的方法:
- 如果您的系统支持它,则使用它。 分配足够大的缓冲区,以便一次读取一整行。
getline()
getline()
- 或用于读取行片段并检查它是否以换行符结尾。
fgets
评论
while (line[cbs - 2])
fgets
strchr
strcspn