[C ++矢量,带有指向对象问题的指针

问题描述 投票:0回答:1
if(myFile.good())
{
    char inputline[100];
    myFile.getline(inputline,100);
    myFile.getline(inputline,100);
    do
    {
        int flag=0, am_i=0,ln_i=0,fn_i=0;
        char am[10], lastname[25], firstname[25];
        for(int i=0;i<100;i++){
            if(inputline[i] == ';'){
                flag++;
                continue;
            }

            if(inputline[i] == '\0')
                break;
            if(flag == 0){
                am[am_i] = inputline[i];
                am_i++;
            }
            if(flag == 1){
                lastname[ln_i] = inputline[i];
                ln_i++;
            }
            if(flag == 2){
                firstname[fn_i] = inputline[i];
                fn_i++;
            }
        }
        students.push_back(new Student(am,firstname,lastname));
        myFile.getline(inputline ,100);
    }
    while (!myFile.eof());
    for(Student* x: students){
        x->print();
    }

}

我想读取一个包含每个学生一行的csv文件,并与学生创建一个向量。

问题是,最后,当我从vector打印学生时,所有学生都具有最后一个的值。

有人可以帮我,哪里错了?

谢谢大家!

c++ object pointers vector
1个回答
0
投票

我看到的是,在从getline字符串逐字符读取char数组后,char数组的内容有误,因为您只是忘记了还必须写终止符''\ 0'。现在,该字符串将不会终止,即使不会在char数组的长度所预期的理论末端也不会终止。

逐步:

输入文件中一行的示例内容

 a;aa;aaa
  • 您在循环中将整行读入inputline
  • 在for循环中,您将第一个字符复制到am []
  • 在for循环的下一步中找到';'并设置标志但现在char[] am的位置0包含b,但没有'\ 0'来终止该“字符串”。如果现在将该非终止字符串传递给Student的构造函数,它将复制更多预期的字符。总数完全未知,您可以超过char[]的给定大小。这使您的程序具有“未定义的行为”!您必须保证在复制字节后还必须写入终止符'\0'

您也没有检查getline是否真的读取字符。如果输入文件中有空行,则会获得上一条记录的完整副本。

总的来说,您获得的所有记录都是您阅读的最后一个记录,因此无法与您提供的出处一致!

© www.soinside.com 2019 - 2024. All rights reserved.