2012-02-28 54 views
0

我在从输入到数组结构中读取文件时遇到了很多麻烦。这里是代码,如果有人可以告诉我什么即时做错了我可以弄明白。循环应该是读取2个字符串和1个int,并跳过可能的空行。但是当我运行它时,它会读取第一组并在此后不读取任何内容。C++在数组中读取故障

struct Instruments 
{ 
string model; 
string maker; 
int year; 
}; 

int main() 
{ 
int size; 
Instruments data[20]; 
int i =0; 

ifstream fin; 
fin.open("input.txt"); 

for (i=0; i<20; i++) 
{ 
do{ 
getline(fin, data[size].model); 
    getline (fin, data[size].maker); 
fin >> data[size].year; 

    size++; 
} 
while (data[size].model.length() > 0); 
} 

fin.close(); 

for(int i=0;i<size; i++) 
{ 
     cout << data[i].model << "model"<<endl; 
     cout << data[i].maker << "maker" << endl; 
     cout << data[i].year<< " year" << endl; 
} 
return 0; 
} 
+0

什么是循环内的do循环的突然infactuation?请参阅http://stackoverflow.com/questions/9475404/c-why-is-this-loop-flawed-to-read-in-data-to-a-struct-array/9475435#9475435 – paxdiablo 2012-02-28 06:43:10

回答

1

有多个问题在这里:。

  1. 您的第一个'for'循环使用i作为循环计数器,但size作为数组索引。

  2. 此调用后:

    fin >> data[size].year

    它会读取到该号码,随后将形成你的下一个读一部分的任何空格结束,所以如果你希望开始下一个记录在下一行,在这里也做一个空白的getline()。

除此之外。

  1. 使用的载体不是数组
  2. 已经从一个流中读取到你的结构的方法,以及如果成功,使用的push_back()将其添加到您的载体。

这并不意味着你必须循环,直到读取失败,这可能是你事先知道你有多少人想读。但你仍然应该这样做。

1

size变量未初始化。在C++中,变量不会自动初始化。

您必须添加:

int size = 0; 
0

这只是一个猜测。除了对size的缺失的初始化,如下:

do{ 
..... 
} 
while (data[size].model.length() > 0); 

看起来也相当可疑的对我说:只要data[size].model有一些内容(第一次读之后,确实如此,这将评估为true,你可能有一个无限循环

如果你正确工艺的for循环,你不需要do-while