【问题标题】:String being empty still gives True value字符串为空仍然给出 True 值
【发布时间】:2021-06-23 23:53:25
【问题描述】:

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

File的输入值为:

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 条件(!line.empty()) 在文件结束后返回一个真值。我尝试用 `(line != "\n") 替换它,但错误仍然存​​在。错误的原因可能是什么?

【问题讨论】:

  • while(getline(input, line)) -- 你为什么不做这么简单的事情?循环底部不需要getline。
  • 是的,虽然 (getline(input, line)) 有效,但如果另一个原因相同,为什么会导致错误?
  • @PaulMcKenzie 它必须是while(getline(input, line)) { if(line.empty()) break; ...,但是是的,这样会更健壮。
  • 与其猜测line 是什么,不如去检查一下? (您可以使用调试器或将其及其大小流式传输到std::cerr。)

标签: c++ file-io eof getline


【解决方案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。我认为一般规则是,一旦流失败,则所有赌注都将关闭。因此,按照评论者的建议,在每次操作后检查流状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多