我正在尝试将航班时刻表从文件读入Flight
班级。
使用Microsoft Visual Studio 2015时遇到了问题。我在tutorialspoint
c ++在线编译器上尝试使用相同的代码,一切正常。
以下是文本文件的示例数据:
LAS VEGAS; 21:15; AA223; A3;
DALLAS; 21:00; BA036; A3;
LONDON; 20:30; AA220; B4;
MEXICO; 19:00; VI303; B4;
LONDON; 17:45; BA087; B4;
这是我收到的错误消息:
sf.exe中0x75F25B68处的未处理异常:Microsoft C ++异常:内存位置0x00C5EE9C处的std :: out_of_range。
这里显然出现问题的流提取器
istream &operator>>(istream &is, Flight &f) {
std::string singleLine;
is >> singleLine;
std::string s0, s1, s2, s3;
size_t loc = singleLine.find(';');
s0 = singleLine.substr(0, loc);
singleLine.erase(0, loc + 1);
loc = singleLine.find(';');
s1 = singleLine.substr(1, loc - 1);
singleLine.erase(0, loc + 1);
loc = singleLine.find(';');
s2 = singleLine.substr(1, loc - 1);
singleLine.erase(0, loc + 1);
s3 = singleLine.substr(1, 2);
f.set_lightNo(s0);
f.set_destination(s1);
f.set_departure(s2);
f.set_gateNo(s3);
return is;
}
答案 0 :(得分:1)
问题在于您阅读了以下行:
is >> singleLine; // <== ouch !
然后singleLine
将在遇到的第一个空格处结束,而不是保持整行!
在您的示例数据中,第一个空格紧跟在第一个;
之后。因此,当您执行第二个find(';')
时,将找不到返回值,即string::npos
,这是loc
可以包含的最大值(非常大的数字)。当您尝试访问substr(1, loc - 1)
时,您肯定会超出范围。
如果用以下代码替换该行,
getline (is, singleLine); // will get the full line until nweline or eof
<强>建议:强>
进一步的改进是在其他任何事情之前检查读取是否成功:
istream &operator>>(istream &is, Flight &f) {
std::string singleLine;
if (getline (is, singleLine)) {
...
}
return is;
}