【发布时间】:2011-11-22 21:38:28
【问题描述】:
我的问题是,我想从std::cin 读取输入,但不知道输入的长度。另外我必须char 并且不能使用std::string。
我必须处理两种方法:
a) 用户输入文本,当他点击 [ENTER] 时程序停止阅读。
b) 用户将std::cin 重定向到一个可以容纳多行的文件(如.\a.oput < file)。
编辑:刚刚注意到 std::cin.eof() 在从文件读取的情况下也总是错误的。
对于 a) 我可以阅读直到 \n 出现。对于 b) Edit: No (我可以阅读直到 std::cin.eof() 发生。) 但是当我不知道我遇到的是 a) 还是 a b) 问题时,我该如何打破阅读过程?
这就是我想要的 a) ...
char buffer = ' ';
while(std::cin >> std::noskipws >> buffer && buffer != '\n')
{
// do some stuff with buffer
}
... 和 b)
char buffer = ' ';
while(std::cin >> std::noskipws >> buffer)
{
// do some stuff with buffer
}
我还知道有std::cin.tellg() 可以获取流中的当前位置。
编辑:因此,在文件的情况下,输入流似乎被终止,就像std::cin >> std::noskipws >> buffer 得到false 一样。
上面的代码对 a) 做了什么:
- 等待用户输入并按下 [ENTER]
- 然后循环遍历用户在最后一行输入的每个字符。
- 然后它再次等待用户输入并按 [ENTER]
- 无限等待处理循环
那我该怎么做呢?
【问题讨论】:
-
告诉我们为什么你不能使用
std::string。也许我们也可以帮助您解决这个问题。 -
对于非标准代码,您可以在
conio.h中使用kbhit() -
@Rob 这是来自练习,我们还不“知道”
std::string。我们也不能使用非标准代码。我要问的不是练习中直接需要的,但我只是好奇...... -
我强烈建议重新设计这个要求。一个程序的输入界面应该是一致的。如果是单行,则应该是单行。如果它被读取到文件末尾,它应该被读取到文件末尾。对于不可移植的代码,有
isatty,但如果绝对需要,最好是一个选项标志来设置模式。 -
为什么不像
while(std::cin>>std::noskipws>>buffer && !std::cin.eof() && buffer != '\n')那样结合这两个条件呢?
标签: c++ iostream stdin eof io-redirection