我的问题是,我想从std::cin
读取输入,但不知道输入的时间。此外,我必须char
,不能使用std::string
。
我必须处理两种方式:
a)用户输入文本,当他按[ENTER]时,程序停止读取。
b)用户将std::cin
重定向到可以容纳多行的文件(如.\a.oput < file
)。
编辑:注意到std :: cin.eof()在读取文件时也总是为假。
对于a)我可以阅读直到\ n发生。对于b)编辑:否(我可以阅读直到std :: cin.eof()发生。) 但是,当我不知道我是否会遇到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)的作用:
那我该怎么办?
答案 0 :(得分:2)
您可以要求输入始终结束EOF(意味着需要按^D
的命令行),然后一如既往地使用b的过程。然后,这将启用cmdline的多行输入
答案 1 :(得分:0)
您可以使用(旧)getline函数,该函数获取指向char数组的指针并可以使用分隔符。但你不能确保在每种情况下它都会读取到eof(因为char缓冲区可能太小),但是使用char数组并且不注意它的大小是非常危险的(并且来自无论如何,安全灾难性的事情可能导致buffer-overflows容易被利用。
此代码应该允许您从输入中逐行提取:
char buffer[256];
while(getline(buffer,256,'\n')) { //get a line
/* do something with the line */
}
这是为了读取最大量的字符:
char buffer[256];
while(getline(buffer,256)) {//get a maximum amount out of the input
/* do something with the line */
}