getline超过指定的数量

getline going over specified amount

本文关键字:getline      更新时间:2023-10-16

我有这个代码。。。。

    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 char,然后它试图将一个null(未初始化)字符串推回到导致挂起/崩溃的向量上。有人知道绕过这个的办法吗?我认为使用getline会将char数组截断为199(+null)个字符,但显然没有发生这种情况。我被难住了。问题是,我希望每个推回最多有200个字符。我真的不想要整行,这就是"字符串str"的作用。如果一行超过200个字符,它应该读取前200个,然后转到下一行。

用以下内容替换输入循环:

    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);
}