2012-02-28 50 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循環來將數據讀入結構體。

相關問題