我正在阅读一个文件,这是一个问题池,其中包含问题类型,章节,价值多少,问题和答案。这段代码检查最小和最大章节(来自用户输入)是否在范围内(来自未知大小的文件)。我知道它在向量的末尾添加了一个额外的行,这导致错误,但我该如何解决?代码是:
void checker(int min, int max, string file) {
ifstream myfile;
string line;
vector<int> numlist;
myfile.open(file);
while (myfile.is_open()) {
if (!getline(myfile, line)) {
break;
} else {
vector<string> chap = split_string(line);
int chapter = str2int(chap[2]);
numlist.push_back(chapter); //This is where the error is. Makes vector go out of range.
}
}
int small = 1000;
int large = 0;
for (size_t i = 0; i < numlist.size(); i++) {
if (numlist[i] < small) {
small = numlist[i];
}
}
for (size_t i = 0; i < numlist.size(); i++) {
if (numlist[i] > large) {
large = numlist[i];
}
}
if (min > max) {
cout
<< "Error: Please enter a number lower than or equal to the maximum chapter: "
<< endl;
cin >> min;
cout << endl;
} else if (min < small) {
cout
<< "Error: Please enter a number bigger than or equal than the minimum chapter ("
<< small << "): " << endl;
cin >> min;
cout << endl;
} else if (max > large) {
cout
<< "Error: Please enter a number bigger than or equal than the maximum chapter ("
<< large << "): " << endl;
cin >> max;
cout << endl;
}
myfile.close();
}
答案 0 :(得分:0)
它告诉你'chap'没有3个元素:
str2int(chap[2]);
如果您使用Visual Studio命中F11进入main,您应该在调试器下运行以查看查找的内容。
---编辑---
此出现作为您的问题代码:
vector<string> chap = split_string(line);
int chapter = str2int(chap[2]);
如果split_string返回少于3个元素的向量,则为
行 int chapter = str2int(chap[2]);
无效。由于执行检查的方式,在调试器外部运行可执行文件时,可执行文件会错误报告崩溃的确切位置。
您需要做的是:
std::vector<std::string> chap = split_string(line);
if(chap.size() > 2) {
int chapter = str2int(chap[2]);
numlist.push_back(chapter);
}
或可能
if (!line.empty()) {
std::vector<std::string> chap = split_string(line);
if (chap.size() > 2) {
int chapter = str2int(chap[2]);
numlist.push_back(chapter);
}
}
答案 1 :(得分:0)
void checker(int min, int max, string file) {
ifstream myfile;
string line;
vector<int> numlist;
myfile.open(file);
while (!myfile.eof()) {
if (!getline(myfile, line)) {
break;
} else if(line!="") {
vector<string> chap = split_string(line);
int chapter = str2int(chap[2]);
numlist.push_back(chapter);
}
}
//other code cut out because it was not important
我刚刚使用我的任务转入此代码并且它有效! chap [2]是读入文件中一行的第三个元素。文件中有许多行(在其他函数和类的帮助下)变成了自己的向量。但是每个向量的第三个元素(从文件读入的一行)是一个数字,它是章节编号(chap [2])。现在这证明了第2章不是罪魁祸首。 以下是文件中一行的示例: short @ 1 @ 10 @在继承中,“父”类的技术术语是什么?@base class