我有一个包含以下代码段的代码:
std::string input;
while(std::getline(std::cin, input))
{
//some read only processing with input
}
当我运行程序代码时,我通过文件 in.txt(使用 gedit 创建)重定向标准输入输入,它包含:
ABCD
DEFG
HIJK
上述每一行都以 in.txt 文件中的一个换行符结尾。
我面临的问题是,while循环运行3次(每行)后,程序控制不前进并卡住。我的问题是为什么会发生这种情况,我能做些什么来解决这个问题?
一些澄清:
我希望能够像这样从命令行运行程序:
$ gcc program.cc -o out
$ ./out < in.txt
附加信息:
我做了一些调试,发现while循环实际上运行了4次(第四次输入为空字符串)。这导致循环编程停止,因为//some processing read only with input无法完成其工作。
所以我提炼的问题:
1)为什么第四个循环运行?
在 while 循环的条件中使用 std::getline() 背后的基本原理必须是,当 getline() 无法读取更多输入时,它返回零,因此 while 循环中断。
与此相反,while 循环以空字符串继续!那么为什么在while循环条件中有getline呢?这不是糟糕的设计吗?
2) 如果不使用 break 语句,如何确保 while 不会第四次运行?
现在我使用了一个 break 语句和字符串流,如下所示:
std::string input; char temp; while(std::getline(std::cin, input)) { std::istringstream iss(input); if (!(iss >>temp)) { break; } //some read only processing with input }
但显然必须有一种更优雅的方式。