我几乎尝试了一切。只是寻找一些提示。
该项目是将文件[“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;
*/
}
}
答案 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
的数组N
,a[N]
不是数组的一部分。数组的迭代器类型是指针。
那么,让我们看看如何在你的情况下使用std :: sort:
std::sort(racers, racers + MAX);
上述行可以理解为“按racers
和racers + 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
}