提问人:Ayush Mangukia 提问时间:3/27/2021 最后编辑:JaMiTAyush Mangukia 更新时间:3/27/2021 访问量:84
字符串为空仍提供 True 值
String being empty still gives True value
问:
该代码用于使用二进制堆实现 Max-Heaps,输出为 1000 行不需要的行。
auto input = ifstream(filename);
string line;
getline(input,line);
while(!line.empty())
{
int option;
int in;
stringstream l(line);
l >> in;
option = in;
switch (option)
{
case 0:
{
cout << getMax() << "\n";
break;
}
case 1:
{
while(l >> in)
{
insert(in);
}
break;
}
case 2:
{
cout << extractMax() << "\n";
break;
}
case 3:
{
filled = -1;
while(l >> in)
{
insert(in);
}
break;
}
}
getline(input,line);
}
文件的输入值为:
1 6 2 8 12 3 7
0
2
2
0
1 11
0
3 5 15 12 7 9 13 35
2
2
2
调试时,while 条件在文件结束后返回 true 值。我尝试将其替换为'(line != “\n”),但错误仍然存在。错误的原因可能是什么?(!line.empty())
答:
1赞
systemcpro
3/27/2021
#1
回应“他们做同样的事情”的评论。差一点。如果 getline 失败,则字符串保持不变(在本例中)。
#include <string>
#include <fstream>
#include <iostream>
int main(int, char**)
{
std::ifstream is("some invalid file name"); // nonsense
std::string s = "Hello World"; // any value will do
std::getline(is, s);
std::cout << "s = " << s << '\n';
return 0;
}
这应该打印 .我认为一般规则是,一旦流失败,那么所有的赌注都会关闭。因此,在每次操作后检查流状态是评论者建议的方法。s = Hello World
评论
while(getline(input, line))
-- 你为什么不做这么简单的事情吗?在循环的底部不需要 a。getline
(getline(input, line))
while(getline(input, line)) { if(line.empty()) break; ...
line
std::cerr