【问题标题】:getline going over specified amountgetline 超过指定数量
【发布时间】:2012-03-14 13:33:25
【问题描述】:

我有这个代码....

    file_parser::file_parser(string file){
        txtfile.open(file.c_str(), ios::in);
        if (!txtfile.good()){
            string error=err(0," "+file+" not found. Exit code ",1);
            throw file_parse_exception(error);
        }
        while (!txtfile.eof()){
            char str[200];
            txtfile.getline(str, 200);
            string str2=str;
            vfile.push_back(str2);
        }
        txtfile.close();
    }

问题是,如果我在输入文件中有一行超过 200 个字符,它会挂起然后崩溃。我在崩溃时检查了 str 的值,它前面是一个空字符,然后它尝试将一个空(未初始化)字符串推回导致挂起/崩溃的向量上。有谁知道解决这个问题的方法?我认为通过使用 getline 它会在 199(+null) 个字符处截断 char 数组,但显然这没有发生。我难住了。问题是我希望每次回击最多有 200 个字符。我真的不想要'string str'会做的整条线。如果一行超过 200 个字符,则应读取前 200 个字符,然后继续下一行。

【问题讨论】:

  • vector<std::string> 还是vector<const char*>
  • 我应该提到我正在使用命名空间 std。只是为了让我们都清楚。
  • 它是向量(标准隐含)

标签: c++ arrays string char getline


【解决方案1】:

用这个替换你的输入循环:

    std::string str;
    while (std::getline(txtfile, str)){
        vfile.push_back(str);
    }

使用ios::eof() 作为循环条件几乎总是会产生错误的程序,就像这里一样。在这种情况下,使用eof() 有两个问题。首先,eof() 仅设置 after 读取失败,而不是之前,但您在读取之前检查它。其次,eof() 不检查其他错误的范围。当输入行超过 200 个字符时,istream::getline 设置 failbit,但不设置 eofbit


编辑:加上将输入行限制为 200 个字符的附加要求,这应该可以:
// untested
std::string str;
while(std::getline(txtfile, str)) {
    if(str.size() > 200)
        str.erase(200, std::string::npos);
    vfile.push_back(str);
}

【讨论】:

  • 这并不能解释他的行为
  • 当然可以。他构建了一个无限循环。在第一次istream::getline 失败后,failbit 被设置,但eofbit 被清除。因此,他创建了一个无限循环,每次迭代都将空字符串推入他的向量中。最终,他的记忆力耗尽了。无论如何,他没有要求解释,而是要求“解决这个问题的方法”。
  • 总是写一个解释,即使它只是为了未来的读者(和其他人所以他们不认为你错了:))@crazy_pants 你可以将你的代码更改为@987654334 @ 它将被修复
  • @SethCarnegie - 1) 感谢您的建议。 2)您的解决方案在第一行停止阅读。我认为 OP想继续阅读行直到文件结束。
  • 我需要在 200 个字符后截断。 source.getline(destination, streamsize, delimiter(optional, \n 是默认值)) 如果我按照您描述的方式使用它,则字符串类型对行长度没有限制。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 2018-12-07
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多