C++ C++,逐行读取文本文件后,向量中出现错误
这是我想做的 当逐行读取文本文件并拆分每一行时,我想让它检查ID(第一个)是否等于我想要的ID。如果它等于,则将线的其余部分放入除ID之外的向量中 文本文件(示例): 这是到目前为止我的代码,但由于某种原因,我得到了一个“向量下标超出范围”错误C++ C++,逐行读取文本文件后,向量中出现错误,c++,file-io,visual-studio-2015,C++,File Io,Visual Studio 2015,这是我想做的 当逐行读取文本文件并拆分每一行时,我想让它检查ID(第一个)是否等于我想要的ID。如果它等于,则将线的其余部分放入除ID之外的向量中 文本文件(示例): 这是到目前为止我的代码,但由于某种原因,我得到了一个“向量下标超出范围”错误 #包括。。。 使用名称空间std; 病媒等级; void getgrades(字符串x){ 字符串gtemp; ifstreammyfile; myfile.open(“Test.txt”); while(getline(myfile,gtemp)){
#包括。。。
使用名称空间std;
病媒等级;
void getgrades(字符串x){
字符串gtemp;
ifstreammyfile;
myfile.open(“Test.txt”);
while(getline(myfile,gtemp)){
stringstream ss(gtemp);
弦托贝;
while(getline(ss,ToBe,,)){
等级。推回(ToBe);
}
如果(等级[0]!=x){
等级。清晰();
}
否则{
Grades.erase(Grades.begin());
}
}
}
int main(){
字符串x;
cout>x;
成绩(x),;
cout当您找到正确的行时,您不会退出外部窗口
因此,外部while循环将继续,并且由于下一行与ID不匹配,您的向量将被清除。因此,当您尝试访问任何元素时,您将必须离开boudns
要更正,只需按如下方式完成代码:
...
else {
Grades.erase(Grades.begin());
break; //<============ exit the outer while
}
。。。
否则{
Grades.erase(Grades.begin());
中断;//您的逻辑是错误的
F.e.您输入了ID=11111,然后在第一个“while(getline(myfile,gtemp))”循环之后,您的“Grades”向量中将包含以下内容:
分数[0]=分数
等级[1]=100
等级[2]=40
等级[3]=30
在此之后,下一个“while(getline(myfile,gtemp))”将清除等级向量,因为等级[0]=Mark,它不再等于x在找到id后继续读取,并清除下一个id上的向量,使其为空
找到x
并收集其分数后,您可以立即中断
你也不需要为每个人收集分数并清除它们,你可以跳过你不感兴趣的行(而且全局成绩很差,嗯?)
vector getgrades(字符串x){
病媒等级;
弦线;
ifstream myfile(“Test.txt”);
while(getline(myfile,line)){
弦流ss(线);
字符串id;
如果(ss>>id&&id==x)
{
串级;
而(ss>>年级){
坡度。向后推(坡度);
}
打破
}
}
返回等级;
}
您应该在擦除后返回,否则将得到垃圾值。您确定向量包含4个元素吗?您是否尝试打印Grades.size()
?听起来你可能需要学习如何使用调试器来逐步调试代码。有了一个好的调试器,你可以逐行执行你的程序,看看它偏离了你的预期。如果你要做任何编程,这是一个必不可少的工具。进一步阅读:更像是应该有一个不同的等级
对于每个人,它都会被修改(清除、擦除),然后推到主向量。@LogicStuff确实,如果OP打算加载内存中的所有内容,而不是一次对文件执行一个操作。那么一个map
可以通过ID访问成绩。谢谢你的更正。我真不敢相信我错过了那个小细节。。。
#include...
using namespace std;
vector <string> Grades;
void getgrades(string x) {
string gtemp;
ifstream myfile;
myfile.open("Test.txt");
while (getline(myfile, gtemp)) {
stringstream ss(gtemp);
string ToBe;
while (getline(ss, ToBe, ' ')) {
Grades.push_back(ToBe);
}
if (Grades[0] != x) {
Grades.clear();
}
else {
Grades.erase(Grades.begin());
}
}
}
int main() {
string x;
cout << "Enter the ID: ";
cin >> x;
getgrades(x);
cout << "Name:" << Grades[0] << endl;
cout << "Grades: " << Grades[1] << " " << Grades[2] << " "<< Grades[3] <<endl;
return 0;
}
...
else {
Grades.erase(Grades.begin());
break; //<============ exit the outer while
}
vector<string> getgrades(string x) {
vector<string> grades;
string line;
ifstream myfile("Test.txt");
while (getline(myfile, line)) {
stringstream ss(line);
string id;
if (ss >> id && id == x)
{
string grade;
while (ss >> grade) {
grades.push_back(grade);
}
break;
}
}
return grades;
}