2011-04-24 143 views
1

我已經嘗試過幾乎所有的東西。只是尋找一些提示。從文件讀取數據到結構中,排序數據並寫入文件

該項目是從一個文件[「racers2011.txt」]中讀取數據到一個結構中,並對男性的比賽時間進行排序,並對女性的比賽時間進行排序。他們將男性和女性分組並將他們的等級和比賽時間輸出,作爲他們最好的藍色比賽和最好的紅色比賽加起來。我已經讀入文件並將其輸出到新文件,但無法弄清如何對文件進行排序。

如果有人可以幫我一下,我將不勝感激。

這是我迄今(一些我不編譯代碼,所以我曾評論它)代碼:

#include <iostream> 
#include <cstring> 
#include <fstream> 

using namespace std; 

struct Racer_struct 
{ 
    int bib; 
    char sex; 
    char fname[30]; 
    char lname[30]; 
    double b1, b2, r1, r2; 
}; 

bool connectInFile(ifstream& fin, char infilename[]); 

bool connectOutFile(ofstream& fout, char outfilename[]); 

void readData(ifstream& fin, Racer_struct racers[], const int& MAX); 

//void racerGender(ostream& fout, Racer_struct racers[], const int& MAX); 

//double calcTotalTime(Racer_struct racers[], double total[], const int& MAX); 

void writeData(ostream& fout, Racer_struct racers[], const int& MAX); 

int main() 
{ 
    const int MAX = 38; 
    Racer_struct racers[MAX]; 
// double total[MAX]; 

    ifstream fin; 
    ofstream fout; 
    char in_file[30], out_file[30]; 
    bool opened; 
    char title[79]; 

    opened = connectInFile(fin, in_file); 
    cout << opened << endl; 
    opened = connectOutFile(fout, out_file); 
    cout << opened << endl; 

    if(opened) 
    { 
     cout << "CONNECTED to: " << in_file << endl; 
     cout << "WRITING to: " << out_file << endl; 

     for(int i=0; i<=3; i++) 
     { 
      fin.getline(title, 80); 
      fout << title << "\n"; 
     } 
    } 
    readData(fin, racers, MAX); 
    writeData(fout, racers, MAX); 

    fin.close(); 
    fout.close(); 
    cout << endl; 
    return 0; 
} 

bool connectInFile(ifstream& fin, char infilename[]) 
{ 
    bool success = true; 
    cout << "Enter input filename: "; 
    cin >> infilename; 
    fin.open(infilename); 
    if(fin.fail()) 
     success = false; 
    return success; 
} 

bool connectOutFile(ofstream& fout, char outfilename[]) 
{ 
    bool opened = true; 
    cout << "Enter the filename you wish to write to: "; 
    cin >> outfilename; 
    fout.open(outfilename); 
    if(fout.fail()) 
     opened = false; 
    return opened; 
} 

void readData(ifstream& fin, Racer_struct racers[], const int& MAX) 
{ 
    char ws; 

    for(int i=0; i<MAX && fin.peek()!= EOF; i++) 
    { 
     fin >> racers[i].bib >> racers[i].sex >> racers[i].fname >> racers[i].lname 
      >> racers[i].b1 >> racers[i].b2 >> racers[i].r1 >> racers[i].r2; 
     fin.get(ws); 
    } 
} 

/* 
void racerGender(ostream& fout, Racer_struct racers[], const int& MAX) 
{ 

    for(int i=0; i<MAX; i++) 
     if(racers[i].sex == 'M') 
     { 
      calcTotalTime(racers, total, MAX); 
      writeData(fout, racers, MAX); 
     } 
     else 
     { 
      calcTotalTime(racers, total, MAX); 
      writeData(fout, racers, MAX); 
     } 
} 

double calcTotalTime(Racer_struct racers[], double total[], const int& MAX) 
{ 
    double total[MAX]; 

    for(int i=0; i<MAX; i++) 
     if(racers[i].r1 > racers[i].r2 && racers[i].b1 > racers[i].b2) 
      total[i] = racers[i].r2 + racers[i].b2; 
     else if(racers[i].r2 > racers[i].r1 && racers[i].b2 > racers[i].b1) 
      total[i] = racers[i].r1 + racers[i].b1; 
     else if(racers[i].r1 > racers[i].r2 && racers[i].b2 > racers[i].b1) 
      total[i] = racers[i].r2 + racers[i].b1; 
     else 
      total[i] = racers[i].b2 + racers[i].r1; 
    return total[i]; 
} 
*/ 

void writeData(ostream& fout, Racer_struct racers[], const int& MAX) 
{ 
    for(int i=0; i<MAX; i++) 
    { 

     fout << racers[i].bib << "\t" << racers[i].sex << "\t" << racers[i].fname 
      << "\t" << racers[i].lname << "\t" << racers[i].b1 << "\t" << racers[i].b2 
      << "\t" << racers[i].r1 << "\t" << racers[i].r2 /*<< "\t" << total[i]*/ << endl; 

/*  if((i+1)%5) 
      fout << "\t"; 
     else 
      fout << endl; 
*/ 
    } 
} 

回答

1

使用std::sort。說更多會讓它消失,我想這是作業。

+0

,這是家庭作業,學期結束了,我需要這個研究我的決賽。 「使用std :: sort」實際上並不是很有幫助。你能詳細闡述一下嗎?如果你可以看看我的代碼,並告訴我我的某些東西出了問題。那將是真棒。但是,任何幫助都比沒有幫助好,所以謝謝。 – 2011-04-25 00:17:46

+0

嘗試在代碼中使用std :: sort。它應該是非常簡單的,你只需傳遞一些參數來顯示你的容器在哪裏,並給它一個函數來做比較。如果你使用了一個像clang(而不是g ++)的良好編譯器,你應該能夠很好地將它與文檔和編譯器的診斷結合起來。 – 2011-04-25 00:38:56

+0

不會在我的情況下更容易使用交換功能?計算總的比賽時間並交換它們,直到男性和女性排名適當,然後以這種方式將它們放入文件中。 – 2011-04-25 06:21:24

0

正如John Zwinck所說,你可能想用std::sort來進行排序。就我個人而言,我會超負荷operator>>operator<<到閱讀和寫作。我也會重載operator<做比較。

與那些在地方,你的頂級代碼可能是這個樣子:

typedef std::istream_iterator<Racer_struct> reader; 

std::vector<Racer_struct> racers((reader(fin)), reader()); 

std::sort(racers.begin(), racers.end()); 

std::copy(racers.begin(), racers.end(), 
      std::ostream_iterator<Racer_struct>(std::cout, "\n")); 

考慮您的條件(保持男性從女性分開),你可能要正確對待性生活爲主要領域,那麼次。這將把所有的男性和所有的女性組合在一起(按您選擇的順序)。

+0

抱歉傑裏。那稍微高於我的頭。有沒有更簡單更基本的方法來做到這一點? – 2011-04-25 06:25:09

+1

更簡單的方法是使用另一種編程語言,如Python或bash。 – 2011-04-25 12:53:19

+0

您可以在不使用動態數組或甚至std :: sort的情況下對結構進行排序。考慮到我還沒有學過這些方法,這對我來說會更簡單,而且他們不會參加我的期末考試。如果你看了我的代碼,你會發現我有排序的主要組件,只是在執行它們時遇到了麻煩。像我的racerGender()函數,它是正確的,還是我的calcTotalTime()函數,應該工作?謝謝約翰。 – 2011-04-25 17:31:21

0

std::sort是一個非常有效的排序功能,它是標準algorithm中C++標準的一部分。

std::sort使用「迭代器」的概念。這是一個相對強硬的主題,所以我要在這裏粗略地總結一下。在C++中,任何序列都可以表示爲一對迭代器:一個指向第一個元素,第二個指向最後一個之後的一個點(如此,[begin, end[)。這很容易在數組中看到:對於大小爲N的數組aa[N]不是數組的一部分。數組的迭代器類型是一個指針。

那麼,讓我們來看看我們如何能夠在你的情況下使用std ::排序:

std::sort(racers, racers + MAX); 

以上線可以被理解爲「由racersracers + MAX劃定的序列中的元素進行排序」。對於數組,數組的名稱指向第一個元素,並將該大小添加到該地址給出「結束」迭代器(如上所述)。如果您使用的是標準容器,如std::vector,則可以使用矢量的begin()end()方法獲取適當的迭代器。

現在,std::sort使用比較函數比較每個元素二乘二。默認情況下,這是<運算符(因此元素按升序排序)。過載允許您在需要時提供您自己的功能。在我們的情況下,超載<Racer_struct就足夠了:

// This should be defined after Racer_struct and before the first call to std::sort 
bool operator<(const Racer_struct &left, const Racer_struct &right) 
{ 
    // return true if left should get before right 
} 
+0

在我的情況下,使用交換功能會不會更容易?計算總的比賽時間並交換它們,直到男性和女性排名適當,然後以這種方式將它們放入文件中。 – 2011-04-25 06:20:46

+0

你可以隨時編寫你的排序算法。你所描述的內容聽起來像冒泡排序,這是一種非常低效(但簡單)的算法。 'std :: sort'非常快,至少你不需要重新發明輪子。 – 2011-04-25 14:56:42

+0

即時通訊嘗試使用std :: sort,只是無法弄清楚。我怎麼稱呼它,它是如何分類的,它如何知道它的分類。 – 2011-04-25 19:48:38

相關問題