Microsoft C ++异常:内存位置处的std :: out_of_range

时间:2018-07-18 18:23:07

标签: c++ fstream

我试图使用find()和substr()在文件中输出特定行,只是看它是否有效。如您所见,我是一个初学者,所以我希望对我的代码提出任何意见或建议。

inFile.open("config.txt");
string content;
while (getline(inFile, content)){

    if (content[0] && content[1] == '/') continue;

    size_t found = content.find("citylocation.txt");
    string city = content.substr(found);

    cout << city << '\n';

}

1 个答案:

答案 0 :(得分:1)

关于以下摘录的几点注释:

content[0] && content[1] == '/'

当您写content[0]content[1]时,您假设存在位置0和1的字符,不一定是这种情况。您应该在if (content.size() >= 2){ ... }之类的条件下包装此代码,以保护自己免于访问不存在的字符串内容。

其次,由于逻辑AND运算符content[0]的工作方式,因此当前代码会将bool转换为&&。如果要检查第一个和第二个字符都是content[0] == '/' && content[1] == '/'

,则应写'/'

此外,在以下代码段中:

size_t found = content.find("citylocation.txt");
string city = content.substr(found);

如果在字符串中找不到"citylocation.txt",该怎么办? std::string::find通过返回特殊值std::string::npos处理此问题。您应该对此进行测试以检查是否可以找到子字符串,再次防止自己读取无效的内存位置:

size_t found = content.find("citylocation.txt");
if (found != std::string::npos){
    std::string city = content.substr(found);
    // do work with 'city' ...
}