我是C++的新手。
我得到了3列143行的ASCII文件。第一列具有整数,而两列其余均具有浮点数。
目标:将三列分别存储到三个大小为143的数组中。
问题:使用cout打印时,最后一行被重复,我不知道为什么。
ASCII文件示例:
2 41.3 25
2 46.2 30
2 51.5 40
2 56.7 45
3 49.5 525
3 46.2 450
3 54.0 575
3 59.5 650
5 36.0 500
5 39.0 525
5 31.8 480
5 36.4 520
和我的代码:
void my_code()
{
FILE *pfile;
int ball[150];
float energy[150], channel[150];
int ball1[150], i=0;
float energy1[150], channel1[150];
pfile = fopen("./ascii.txt","r");
if (!pfile) continue;
while(!feof(pfile))
{
fscanf(pfile,"%d\t%f\t%f",&ball[0],&energy[0],&channel[0]);
ball1[i]=ball[0];
energy1[i]=energy[0];
channel1[i]=channel[0];
cout<<i<<"\n";
cout<<ball1[i]<<" "<<" "<<energy1[i]<<" "<<channel1[i]<<"\n";
i++;
}
}
请帮助我理解。我也很愿意获得改进我的代码的建议。
最佳答案
您的麻烦在于循环测试在循环中的位置。试试这个,代替:
while(true)
{
fscanf(pfile,"%d\t%f\t%f",&ball[0],&energy[0],&channel[0]);
if (feof(pfile)) break;
ball1[i]=ball[0];
energy1[i]=energy[0];
channel1[i]=channel[0];
cout<<i<<"\n";
cout<<ball1[i]<<" "<<" "<<energy1[i]<<" "<<channel1[i]<<"\n";
i++;
}
编程新手经常会以这种方式犯错。循环实际上对于早期尝试来说是相当不错的,但是请务必仔细考虑循环要退出的点。如果退出点关闭,则会对循环的最终迭代产生奇怪的影响。
一旦您了解了答案,就应该建议许多程序员习惯于弃用(有些仍然弃用)从循环 Action 中间中断循环的风格。也就是说,某些程序员过去往往不喜欢
break
。就个人而言,经过三十年的编程,我通常不同意这种弃用,但是如果您有不喜欢break
的编程指导员,则自然应该考虑该指导员的偏好。