从文件读取数据到结构中,排序数据并写入文件

问题描述:

我已经尝试过几乎所有的东西。只是寻找一些提示。从文件读取数据到结构中,排序数据并写入文件

该项目是从一个文件[“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; 
*/ 
    } 
} 

使用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

正如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

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