getline超过指定金额

时间:2012-02-24 03:36:06

标签: c++ arrays string char getline

我有这个代码......

    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的值,它前面是一个空字符,然后它尝试将一个null(非初始化)字符串推回到导致挂起/崩溃的向量上。有没有人知道解决这个问题的方法?我认为通过使用getline它会将char数组截断为199(+ null)字符,但显然这不会发生。我很难过。问题是我希望每个推回最多有200个字符。我真的不希望WHOLE行是'string str'会做的。如果一行超过200个字符,它应该读取前200个字符然后继续到下一行。

1 个答案:

答案 0 :(得分:1)

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

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

使用ios::eof()作为循环条件几乎总是创建一个错误的程序,就像在这里一样。在这种情况下,使用eof()有两个问题。首先,eof()仅在读取失败后才设置,而不是之前,但是您在读取之前检查它。其次,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);
}