C++ C++,逐行读取文本文件后,向量中出现错误

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)){

这是我想做的

当逐行读取文本文件并拆分每一行时,我想让它检查ID(第一个)是否等于我想要的ID。如果它等于,则将线的其余部分放入除ID之外的向量中

文本文件(示例):

这是到目前为止我的代码,但由于某种原因,我得到了一个“向量下标超出范围”错误

#包括。。。
使用名称空间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;
}