我有代码,我从文件中输入内容。我的txt文件如下所示:
file.txt的
你好世界 ...
1 2
底部的数字应该被读入变量。至于“你好世界”,它应该被getline
选中。但我不知道txt文件中会有多少行,所以我不知道如何突破它。这是我的代码:
while (getline(file, line))
{
std::cout << line << std::endl;
// ...
}
file >> a >> b; // 1 2
如果我使用cin
执行此操作,我可以Ctrl+Z
停止getline
循环运行。如何在到达while
之前的适当时间突破1 2
循环?
答案 0 :(得分:1)
使用条件和break;
语句。
例如:
while (getline(file, line))
{
std::cout << line << std::endl;
// ...
if(line == "hello world"/){
break;//Exits the loop
}
}
break
语句使您的代码退出它所使用的最内部循环。在这种情况下,它退出while
循环。
编辑:
如果你不想打破特定的行,那么你最好使用正则表达式或其他机制(如std::stringstream
)来找到你正在寻找的字符串的匹配,并捕获你的部分我很感兴趣。我建议你看一下Boost.Regex。
这个想法是循环上线,就像你一样。只要你有匹配,你可以打破(以相同的方式)并从你当前正在阅读的字符串中捕获(在你的代码中将在line
变量中)。
答案 1 :(得分:1)
对于每一行string line
,您可以将其放入istringstream iss
。然后尝试使用a
将其流式传输到b
和iss >> a >> b
,如果可以成功完成,则表示您输入了正确的行。否则,你继续检查下一行。
int a, b;
while (getline(file, line))
{
istringstream iss(line);
if (iss >> a >> b)
{
// you are in the right line, and a,b has the values e.g. 1 2
}
}
除了"hello world"
之外,它还适用于"aaa bbb cc"
之外的其他字符串,只要它们不是您要查找的数字。
P.S。:如果您使用C++11
检查给定的行是否与您要查找的模式匹配,您也可以使用regex
。
答案 2 :(得分:0)
你不确定自己如何确定要突破
循环。标准是什么?如果你想阅读全部
除了最后一行,最简单的解决方案是简单地阅读全部
然后将这些行转换为std::vector<std::string>
过程;你可以遍历一个向量,直到下一个向量
最后一个元素(你不能在流上做)。如果是的话
模仿你想要匹配(说"\\d+\\s+\\d+"
),然后你
可以添加到条件:
std::string line;
std::regex matchNumbers( "\\d+\\s+\\d+" );
while ( std::getline( file, line ) && ! regex_match( line, matchNumbers ) ) {
// ...
}
std::istringstream numbers( line );
numbers >> a >> b;
等等。