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

时间:2011-04-24 23:40:15

标签: c++

我几乎尝试了一切。只是寻找一些提示。

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

3 个答案:

答案 0 :(得分:1)

使用std::sort。说得更多会让它消失,我想这是作业。

答案 1 :(得分: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"));

根据您的标准(让男性与女性分开),您可能希望将性别视为主要领域,然后是时间。这将把所有男性和所有女性聚集在一起(按照您选择的顺序)。

答案 2 :(得分:0)

std::sort是一个非常有效的排序函数,它是标题algorithm中C ++标准的一部分。

std::sort使用“迭代器”的概念。这是一个相对棘手的主题,所以我将在这里大致总结一下。在C ++中,任何序列都可以表示为一对迭代器:一个指向第一个元素,第二个指向最后一个之后的一个点(因此,[begin, end[)。这可以在数组中轻松看出:对于大小为a的数组Na[N]不是数组的一部分。数组的迭代器类型是指针。

那么,让我们看看如何在你的情况下使用std :: sort:

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

上述行可以理解为“按racersracers + MAX分隔的序列中的元素排序”。对于数组,数组的名称指向第一个元素,并将大小添加到该地址给出“结束”迭代器(如上所述)。如果您使用标准容器(如std::vector),则可以使用向量的begin()end()方法来获取相应的迭代器。

现在,std::sort使用比较函数对每个元素进行2比2的比较。默认情况下,这是<运算符(因此元素按升序排序)。过载允许您在需要时提供自己的功能。在我们的例子中,为<重载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
}