【发布时间】:2013-11-09 12:00:01
【问题描述】:
我有一个带有以下 sn-p 的代码:
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次(第四次输入为空字符串)。这会导致循环编程停止,因为 // 某些使用输入只读的处理 无法完成其工作。
所以我提炼的问题:
1) 为什么第四个循环会运行?
在 while 循环的条件下使用 std::getline() 背后的基本原理 必须是,当 getline() 无法读取更多输入时,它会返回 零,因此 while 循环中断。
与此相反,while 循环 而是继续一个空字符串!为什么那么有getline while 循环条件呢?这不是糟糕的设计吗?
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 }但显然必须有更优雅的方式。
【问题讨论】:
-
确实不应该卡住。你用的是什么编译器?
-
我使用的是 gcc 版本 4.6.3
-
@zalenix 我很确定你的问题来自
//some processing with input... -
@zalenix 'while 循环每行运行 3 次' 听起来很奇怪(顺便说一句,这不应该是编译器/lib 问题。我很确定如果曾经存在,我们会知道的!)
标签: c++ while-loop stdin getline gedit