提问人:r3k0j 提问时间:5/8/2022 最后编辑:John Kugelmanr3k0j 更新时间:5/8/2022 访问量:197
使用 EOF 获取所有用户输入?
Get all the user input with EOF?
问:
我无法从终端获取所有用户输入。它总是短一行,而且是最后一行。
do{
getline(std::cin, input);
buffer += input;
buffer += '\n';
}while(!input.empty());
给了我所需的输出,但是当我按Enter键时它结束了,我希望它在它到达文件结束(EOF)时结束,当我按Ctrl + D时。我试过了
while(!(std::cin >> input).eof()){
buffer += input;
buffer += '\n';
}
但它没有得到最后一行。在 while 循环之后将输入添加到缓冲区也不能解决它。
答:
1赞
anastaciu
5/8/2022
#1
使用 getline
继续阅读输入:
std::string buffer;
std::string input;
while (std::getline(std::cin, input))
{
buffer += input;
buffer += '\n';
}
当您输入时将设置 eofbit
,循环将结束。EOF
getline
在任何情况下,第二个代码段也应该存储最后一个输入。
评论
0赞
r3k0j
5/8/2022
我相信这也会在输入完成后添加一个新行,对吗?如果是这样,有没有办法避免这种情况?
1赞
anastaciu
5/8/2022
@r3k0j 有几种方法可以忽略缓冲区上的剩余部分,其中一种是使用 .\n
cin.ignore()
0赞
r3k0j
5/8/2022
看起来 std::cin >>输入不保存输入格式。例如,空格字符将转换为换行符。并且 cin.ignore() 不知何故没有保存其他行的第一个字符,而是期望第一个字符。
1赞
anastaciu
5/8/2022
@r3k0j停在空格处,这意味着它逐字阅读,而不是阅读整行,直到,我有一种感觉你需要整行,所以我从我的评论中删除了那部分。cin
getline
\n
1赞
anastaciu
5/8/2022
@r3k0j de loop 中你不需要,会自行忽略它,我说的是最后一个输入,在循环之后,a 将在输入缓冲区中重新出现,所以如果你想删除最后一个,请在循环后使用 a。在循环中,您不需要任何其他东西,我提醒您正在添加一个 to ()。cin.ignore
getline
\n
cin.ignore
\n
buffer
buffer += '\n';
评论