2013-04-16 121 views
0

我有很多麻煩能夠從文件中獲取數據並將其輸入到給定的結構和數組結構中,然後輸出文件。我們給出一個包含96行和看起來像這樣一個文件:從文件輸出數據到結構和數組結構

Arzin,尼爾
2.3 6.0 5.0 6.7 7.8 5.6 8.9 7.6
爾斯巴貝奇,查爾斯
2.3 5.6 6.5 7.6 8.7 7.8 5.4 4.5

此文件繼續爲24個不同的人,然後重複不同的分數(第二行)。 第一個數字在這種情況下是2.3,因爲這兩個人都是難度等級。接下來的6個數字是分數。

我們給出這個數據,以建立我們的結構和數組和我的代碼:

#include <iostream> 
#include <fstream> 
#include <iomanip> 
#include <string> 
#include <cmath> 
using namespace std; 
int main() 
{ 

    ifstream inFile; 
    inFile.open("C://diveData.txt"); 

    // checking to see if file opens correctly 
    if (!inFile) 
    { 
     cout << "Error opening the file!" << endl; 
    } 

    const int numRounds = 2;    // variable to hold the number of rounds 
    const int numScores = 7;    // variable to hold the number of rounds 
    const int numDivers = 24;    // variable to hold the number of divers 
    typedef double DifficultyList[numRounds]; // 1D array for storing difficulty    of dives on each round 
    typedef double ScoreTable [numRounds] [numScores]; // 2D array of dive scores 

// struct to store information for one diver 
    struct DiverRecord 
{ 
    string name; 
    double totalScore; 
    double diveTotal; 
    DifficultyList diff; 
    ScoreTable scores; 
}; 

DiverRecord DiverList[numDivers]; 

// my attempt at printing out the contents of the file 
    while (!EOF) 
{ 
    for (int x = 0; x < 25; x++) 
    { 
     infile >> DiverList[x].name; 
     inFile >> DiverList[x].totalScore; 
     inFile >> DiverList[x].diveTotal; 

     cout << DiverList.[x].name << endl; 
     cout << DiverList.[x].totalScore << endl; 
     cout << DiverList.[x].diveTotal << endl; 
    } 
    } 

return 0; 
} 
+0

對於初學者來說,這不會讀取任何東西。 'EOF'通常是'(-1)',它總是評估爲非零,因此'while(!EOF)'將立即中斷。 – WhozCraig

回答

0

幾個問題:

  1. 決定ifstream是打開還是沒有,使用ifstream::is_open;
  2. 決定是否遇到end of file,請嘗試下面的代碼;
  3. 如果我得到它的權利,你的輸入文件格式應該是:

    1,名稱
    困難score1 score2 ... score7

    在這個意義上說,totalScore不應該從流中輸入,但計算出來。

  4. 你有一個記錄的兩個名字,所以你的記錄結構的定義看起來很模糊。

這裏是一個修訂版:

#include <string> 
#include <vector> 
#include <fstream> 
#include <iostream> 
using namespace std; 

struct DiverRecord 
{ 
    string a, b; 
    double totalScore; 
    double difficulty; 
    double scores[7]; 
}; 

int main() 
{ 

    ifstream inFile("C://diveData.txt"); 

    // checking to see if file opens correctly 
    if (!inFile.is_open()) { 
     cout << "Error opening the file!" << endl; 
    } 

    vector<DiverRecord> DiverList; 

    DiverRecord record; 
    char ch; 
    while (inFile) { 
     inFile >> record.a >> ch >> record.b >> record.difficulty; 
     record.totalScore = 0; 
     for (int i = 0; i < 7; ++i) { 
      inFile >> record.scores[i]; 
      record.totalScore += record.scores[i]; 
     } 

     DiverList.push_back(record); 
    } 

    // output your DiverList here. 

    return 0; 
} 
+0

我今天去了我的朗誦,被告知我們不必使用給予我們的結構和數組來訪問文件並執行一些輸出。我認爲使用結構和數組會更容易。我繼續擺弄它,並使用上面的建議,但仍然沒有運氣!我現在試着不使用結構體和數組,而是使用getline,但是這也證明使用起來很麻煩。 – Jane

+0

@Jane我的數據文件格式正確嗎? – gongzhitaao

0

所有>>運營商的第一端輸入的第一個空格字符,所以當你的名讀取你只能得到姓氏以及它會嘗試將第一個名字放入totalScore的逗號。要獲得全名,請執行以下操作。

string temp; 
    infile >> DiverList[x].name; 
    infile >> temp; 
    DiverList[x].name + " "; 
    DiverList[x].name + temp; 

還輸出時,你不需要額外的'。'

cout << DiverList[x].name << endl; 

等應該工作得很好。

0

正如我在我之前的評論中所說的,我現在試圖專注於不使用結構和結構數組,並試圖使用其他函數來從文件中讀取數據。我想提出的數據在邏輯形式,如:

名人士 回合1:困難分值 回合2:困難分值

但我無法訪問從文件的具體內容。

我使用的代碼是:

while(inFile) 
{ 
    string name; 
    getline(inFile, name); 
    cout << name << endl; 
} 

這原樣輸出數據文件,但是當我嘗試申報難度不同的變量和七個得分它正確地在所有不輸出。