从文件读取数据到结构中,排序数据并写入文件
我已经尝试过几乎所有的东西。只是寻找一些提示。从文件读取数据到结构中,排序数据并写入文件
该项目是从一个文件[“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;
*/
}
}
正如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"));
考虑您的条件(保持男性从女性分开),你可能要正确对待性生活为主要领域,那么次。这将把所有的男性和所有的女性组合在一起(按您选择的顺序)。
抱歉杰里。那稍微高于我的头。有没有更简单更基本的方法来做到这一点? – 2011-04-25 06:25:09
更简单的方法是使用另一种编程语言,如Python或bash。 – 2011-04-25 12:53:19
您可以在不使用动态数组或甚至std :: sort的情况下对结构进行排序。考虑到我还没有学过这些方法,这对我来说会更简单,而且他们不会参加我的期末考试。如果你看了我的代码,你会发现我有排序的主要组件,只是在执行它们时遇到了麻烦。像我的racerGender()函数,它是正确的,还是我的calcTotalTime()函数,应该工作?谢谢约翰。 – 2011-04-25 17:31:21
std::sort
是一个非常有效的排序功能,它是标准algorithm
中C++标准的一部分。
std::sort
使用“迭代器”的概念。这是一个相对强硬的主题,所以我要在这里粗略地总结一下。在C++中,任何序列都可以表示为一对迭代器:一个指向第一个元素,第二个指向最后一个之后的一个点(如此,[begin, end[
)。这很容易在数组中看到:对于大小为N
的数组a
,a[N]
不是数组的一部分。数组的迭代器类型是一个指针。
那么,让我们来看看我们如何能够在你的情况下使用std ::排序:
std::sort(racers, racers + MAX);
以上线可以被理解为“由racers
和racers + 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
}
在我的情况下,使用交换功能会不会更容易?计算总的比赛时间并交换它们,直到男性和女性排名适当,然后以这种方式将它们放入文件中。 – 2011-04-25 06:20:46
你可以随时编写你的排序算法。你所描述的内容听起来像冒泡排序,这是一种非常低效(但简单)的算法。 'std :: sort'非常快,至少你不需要重新发明轮子。 – 2011-04-25 14:56:42
即时通讯尝试使用std :: sort,只是无法弄清楚。我怎么称呼它,它是如何分类的,它如何知道它的分类。 – 2011-04-25 19:48:38
,这是家庭作业,学期结束了,我需要这个研究我的决赛。 “使用std :: sort”实际上并不是很有帮助。你能详细阐述一下吗?如果你可以看看我的代码,并告诉我我的某些东西出了问题。那将是真棒。但是,任何帮助都比没有帮助好,所以谢谢。 – 2011-04-25 00:17:46
尝试在代码中使用std :: sort。它应该是非常简单的,你只需传递一些参数来显示你的容器在哪里,并给它一个函数来做比较。如果你使用了一个像clang(而不是g ++)的良好编译器,你应该能够很好地将它与文档和编译器的诊断结合起来。 – 2011-04-25 00:38:56
不会在我的情况下更容易使用交换功能?计算总的比赛时间并交换它们,直到男性和女性排名适当,然后以这种方式将它们放入文件中。 – 2011-04-25 06:21:24