2012-02-28 51 views
0

我正在阅读歌曲名称,歌手和歌曲大小。但它只是在第一套阅读,然后它给了我疯狂的错误价值观。我的代码非常简单直接,所以我想知道是否有人可以给我一个想法。C++为什么这个循环有缺陷将数据读入结构数组?

struct Songs 
{ 
    string title; 
    string artist; 
    int men; 
}; 
// main stuff 

Songs song[50]; 
int size=0; 

for (int i = 0; i<size;i++) 
{ 
    do 
    { 
     getline(fin, song[size].title); 
     getline(fin, song[size].artist); 
     fin >> song[size].mem; 
     size++; 
     i++; 
    } 
    while (song[size].title.length()>0); 
} 
+1

为什么你在for循环中递增我,这已经在每次迭代中递增? – Joe 2012-02-28 02:12:29

+1

您正在设置大小为0,然后尝试启动一个for循环,因为这个,将不会运行。我发现很难破译这段代码实际上应该做什么 - 如果我理解你是正确的,你是否正在从文件中读取数据来填充一些歌曲结构? – 2012-02-28 02:14:13

+1

为什么你在一个循环内有一个循环?如果标题的长度大于0,为什么while循环继续执行? 我不知道你甚至试图完成什么。你能否加入你正在努力解决的问题,并且给我们所有的支持代码,而不仅仅是你认为相关的东西。当然,把它削减一下,这样我们就不会得到代码墙了,但是例如什么是“fin”? – 2012-02-28 02:14:18

回答

1

该代码不应该做任何事情isizefor循环开始时为零。或者,更准确地说,开始:-)

如果你想读你的输入流三胞胎,直到空白标题或您的阵列是满的,你可以像开始:

// Initialise size. 

int size = 0; 

// Try to get first title. 

getline (fin, song[size].title); 

// While a title was successfully read. 

while (song[size].title.length() > 0) { 
    // Get artist and mem (watever that is). 

    getline (fin, song[size].artist); 
    fin >> song[size].mem; 

    Move to next array element, prevent overflow by loop exit. 

    if (++size == 50) 
     break; 

    // Try to get next title. 

    getline (fin, song[size].title); 
} 

// Out here, size is the number of array elements used (0-50). 

它可能无法完美编译,我没有测试过它。它当然不会处理边缘情况,例如只有一个标题的最后一个三元组。它只是为了说明算法。

0

并非最不重要的是while (song[size].title.length()>0)size后看着song[size]已经增加。尝试song[size-1]

1

代码中有很多错误。

1)您正在设置大小为0,然后尝试启动for循环,因为这将不会运行。

2)您的for循环中有一个do-while循环,如果我正确理解它,那么对于您正在尝试执行的任务似乎是不必要的。

3)当试图填充结构时,使用size变量作为数组索引。通常情况下,您会使用您在初始化for循环时设置的迭代器变量,在本例中为i。您不应该与我同时增加尺寸,因为您可能会以无限循环结束。

4)您没有缩进代码!这不完全是一个错误,但它使调试变得更加困难 - 并且可能是您首先陷入困境的原因之一。 (编辑:出现此问题已被更正,现在。)

一般来说,如果您正在读取文件,一种方法是在文件的开始处指定一个整数重新创建,使您能够为堆分配适量的内存,同时还可以设置您的大小变量。然后你使用这个size变量来实现一个for循环来将数据读入结构体。

相关问题