我有这个代码......
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个字符然后继续到下一行。
答案 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);
}