2013-04-23 61 views
0

我有一個文本文件,它看起來像:指針讀取數據到結構C數組++

Azrin, Neil 
2.3 6.0 5.0 6.7 7.8 5.6 8.9 7.6 
Babbage, Charles 
2.3 5.6 6.5 7.6 8.7 7.8 5.4 4.5 

它持續24個不同的名字。名字在第一行,數字在文件的第二行。第一個數字是潛水的難度級別,後面的數字是7位不同評委給出的分數。

我已經能夠讀取潛水員的名字和難度級別,但不會讀入難度級別的分數。

我已經嘗試過所有我能想到的事情,以使其正常工作,任何人都可以請幫忙嗎?

到目前爲止我的代碼將數據讀入結構看起來像這樣

const int NUM_NAMES = 24; 
const int NUM_SCORES = 7; 
const int NUM_ROUNDS = 2; 


typedef double scoreTable[NUM_ROUNDS] [NUM_SCORES]; 
typedef double difficultyList[NUM_ROUNDS]; 

struct diveInfo 
{ 
string diversName; 
double totalScore; 
double diveTotal; 
difficultyList diff; 
scoreTable scores; 

}; 


typedef diveInfo diverList[NUM_NAMES]; 


int main() 
{ 
diveInfo record; 
diveInfo * ptr; 
ptr = &record; 
int lcv; 

ifstream inFile; 
inFile.open ("diveData.txt"); 

if (!inFile) 
{ 
    cout << "ERROR: File could not be opened" << endl << endl; 

    exit (EXIT_FAILURE); 
} 


for (lcv = 0; lcv < NUM_NAMES; lcv++) 

getline(inFile, ptr[lcv].diversName); 

delete ptr; 
ptr = new diveInfo; 

inFile >> *ptr[lcv].diff; 

delete ptr; 
ptr = new diveInfo[NUM_SCORES]; 

inFile >> *ptr[lcv].scores; // here is the problem 

return (EXIT_SUCCESS); 
} 
+1

分數是一個二維數組。 * ptr [lcv] .scores不能訪問您認爲的內容。它看起來並不像你的數據文件對每個潛水員有14個分數,那麼爲什麼在分數陣列中有兩個七輪?您是否也想在從文件中讀取數據後刪除數據?當你輸入delete ptr時,你不再可以訪問剛纔讀取的數據。 – Joshua 2013-04-23 19:11:32

+0

請改善你的編碼風格。很多錯誤在那裏,編碼風格看起來很可怕:( – 2013-04-23 19:23:49

+0

當你寫ptr [lcv]時,你已經取消了ptr的引用,所以你不必使用* – 2013-04-23 19:20:22

回答

-1

您正在使用C++像C.它會更容易,更清晰創建類,而不是結構。

你應該創建一個Parser類,它可以處理你的文件和一個可以存儲名字,難度和一系列分數的Person類。

這樣,您的解析器可以創建Person實例,並且可以將它們存儲在容器中。

此外,您可以使用STL來存儲您的數據。

如果您需要更多解釋,請告訴我。

Regards,

+0

你爲什麼不舉例說明如何做到這一點?這會讓你的答案變得非常有用。 – likeitlikeit 2013-04-23 19:50:19

4

您的代碼非常混亂。我猜這開始很簡單,但是當它不起作用時,它變得越來越複雜。但這很容易,你不需要任何複雜的東西。首先,你不需要指針,你不需要

讓我們從頭開始,你的結構是錯誤的,直到你得到那些對你哪兒也去不了。想想你的數據,你有一個名字,一個難度分數和七個評委的分數。把在一個結構

struct DiveInfo 
{ 
    string diversName; 
    double diff; 
    double scores[7]; 
}; 

現在我們有24次不同的潛水,所以我們需要的24層DiveInfo結構

DiveInfo diveList[24]; 

數組現在我們可以開始做一些閱讀,請記住沒有指針和沒有。這很簡單並不複雜。

for (int i = 0; i < 24; ++i) 
{ 
    getline(inFile, diveList[i].diversName); 
    inFile >> diveList[i].diff; 
    for (int j = 0; j < 7; ++j) 
     inFile >> diveList[i].score[j]; 
    string garbage; 
    getline(inFile, garbage); // move to next line, ready to read next name 
} 

請參閱?每次循環時,我們都會讀取一個DiveInfo(文件中的兩行)。每個DiveInfo都是一個名字,然後是難度分數,然後是7個評委的分數。唯一稍微複雜的是最後的getline(..., garbage);位。當您閱讀最後一個分數時,將輸入移動到下一行是必要的。

+0

+1:好的教程和答案。 – Arun 2013-04-23 19:41:28

0

嘗試

typedef double scoreTable[NUM_ROUNDS] [NUM_SCORES]; 

typedef double scoreTable[NUM_SCORES]; 

您沒有使用數組的第二維中的程序和數據文件不似乎要麼用它改變。

此外,爲什麼要刪除您在閱讀每個項目後創建的數據結構?如果你想要一個diveInfo對象的數組,你應該創建它,然後遍歷你想要讀取的每個記錄。在每條記錄中,您需要逐個讀取每條記錄。

這應該讓你在正確的方向:

diveInfo theDiveInfo[40]; // This array of diveInfo will hold all of the information for 40 divers 

for(int i = 0; i < NUM_RECORD; ++i) 
{ 
    getline(inFile, theDiveInfo[i].diversName); 

    for(int j = 0; j < NUM_SCORES; ++j) 
    inFile >> theDiveInfo[i].scores[j]; 
}