字符串为空仍提供 True 值

String being empty still gives True value

提问人:Ayush Mangukia 提问时间:3/27/2021 最后编辑:JaMiTAyush Mangukia 更新时间:3/27/2021 访问量:84

问:

该代码用于使用二进制堆实现 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())

C++ file-io eof getline

评论

2赞 PaulMcKenzie 3/27/2021
while(getline(input, line))-- 你为什么不做这么简单的事情吗?在循环的底部不需要 a。getline
0赞 Ayush Mangukia 3/27/2021
是的,while 有效,但是如果它做同样的事情,为什么另一个会导致错误?(getline(input, line))
0赞 Ted Lyngmo 3/27/2021
@PaulMcKenzie 它必须如此,但是的,那会更强大。while(getline(input, line)) { if(line.empty()) break; ...
0赞 JaMiT 3/27/2021
与其猜测是什么,不如检查一下呢?(您可以使用调试器或将其及其大小流式传输到 。linestd::cerr

答:

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