我是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的编程指导员,则自然应该考虑该指导员的偏好。

07-26 06:21