【发布时间】:2016-03-01 21:53:15
【问题描述】:
int getLineCount() {
int ret = 0;
char c;
while ((c = fgetc(stdin)) != EOF)
if (c == '\n')
ret++;
return ret + 1;
}
void fill(char *WORD) {
int charIndex = 0;
char c;
while ((c = fgetc(stdin)) != EOF) {
*(WORD + charIndex++) = c;
}
}
int main() {
int lineNum = getLineCount();
char *WORD = (char*)calloc(lineNum * 18,sizeof(int));
fill(WORD);
return 0;
}
这是我的代码的一部分,我的问题是(如您所见):
我试图读取 stdin 的内容两次,但是在 getLineCount 函数之后,它停留在 EOF 并且我无法在 fill 函数中再次读取它。
我在 Linux 中使用此命令从用户那里获取标准输入;
$./output < text_file.txt
有没有办法将标准输入回滚到起始字符?如果没有,我该如何解决这个问题?
谢谢。
【问题讨论】:
-
@user3121023:假设你可以倒带
stdin是一种不好的风格。 -
为什么不存储之前读取的值?这就是变量的用途。
-
我同意@Olaf 的观点,假设您可以倒带
stdin是不好的。对于那些质疑倒带能力的人......如果它是一个终端,那么你当然不能,但如果频道是一个通常允许倒带的设备,那么你当然可以。问题是您通常无法控制stdin是什么设备类型 - 因此假设rewind()/fseek()可以在这里完成是不好的做法。 -
@DoğaCanYanıkoğlu 我强烈建议您考虑其他 cmets 而不是 dup 答案..
-
对
fgetc()的调用返回的类型是整数,而不是字符。文字EOF是一个整数(通常值为-1)如果您的编译器将char设置为无符号,那么char 和EOF 之间的比较将失败。强烈建议更改此:char c;至此int c;(2 个位置)其他所有内容都不需要更改。
标签: c input buffer stdin stdio