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打印学生时,所有学生都具有最后一个的值。
有人可以帮我,哪里错了?
谢谢大家!
我看到的是,在从getline字符串逐字符读取char数组后,char数组的内容有误,因为您只是忘记了还必须写终止符''\ 0'。现在,该字符串将不会终止,即使不会在char数组的长度所预期的理论末端也不会终止。
逐步:
输入文件中一行的示例内容
a;aa;aaa
inputline
。char[] am
的位置0包含b
,但没有'\ 0'来终止该“字符串”。如果现在将该非终止字符串传递给Student
的构造函数,它将复制更多预期的字符。总数完全未知,您可以超过char[]
的给定大小。这使您的程序具有“未定义的行为”!您必须保证在复制字节后还必须写入终止符'\0'
您也没有检查getline
是否真的读取字符。如果输入文件中有空行,则会获得上一条记录的完整副本。
总的来说,您获得的所有记录都是您阅读的最后一个记录,因此无法与您提供的出处一致!