如何按结构成员对文件中的数据进行排序? C ++

时间:2014-04-20 23:33:31

标签: c++ arrays sorting struct

这里我有一个程序,它从文件中读取一些员工数据并将它们存储在一个结构数组中。我正在尝试用" sort_by_age"功能是根据出生日期对从最老的员工到最年轻的员工列出数据的位置对此数据进行排序。" read_file"函数工作正常,程序编译正常,但输出不正确,程序没有按照我的意愿正确排序数据。任何帮助将不胜感激。

从文件中提取几行以了解格式

114680858 19670607 Matilda Vincent MI

114930037 19471024 Desdemona Hanover ID

115550206 19790110 Xanadu Perlman ND

116520629 19630921 Alexander Hall SD

所以,例如,如果这是文件中的所有行(不是),我希望它首先对Desdemona的信息进行排序,然后是亚历山大,然后是matilda' s,然后是xanadu& #39; S

#include<string>
#include<iostream>
#include<fstream>
using namespace std;

struct employees // employee data
{
int ss_number;//social security
int dob;//date of birth YYYY/MM/DD Ex.) 19870314=1987/03/14
string f_name;
string l_name;
string state; //state of residence };


void read_file()//read file into array of 1000 structs
{
ifstream data("/home/www/class/een118/labs/database1.txt");
employees array[100]
if(!data.fail())
{
int i;
for(int i=0;i<100;i++)
{
data>>array[i].ss_number
>>array[i].dob
>>array[i].f_name
>>array[i].l_name
>>array[i].state;
}
for(int i=0;i<100;i++)
{
cout<<array[i].ss_number>>" "<<array[i].dob>>" "<<array[i].f_name>>" "<<
array[i].l_name>>" "<<array[i].state;
}}}


void print_person(employees e)
{
cout<<e.ss_number>>" "<<e.dob>>" "<<e.f_name>>" "<<e.l_name>>" "<<e.state;
}

void sort_by_age(employees array[])
{
employees temp;
for(int i=0;i<100;i++)
{
for(int j=i+1;j<100;j++)
{
if(array[j].dob<array[i].dob)
{
temp=array[i];
array[i]=array[j];
array[j]=temp;}
print_person(array[j]);
cout<<"\n";}}}





int main()
{
employees array[100];
read_file(array);
sort_by_age(array);
}

1 个答案:

答案 0 :(得分:0)

例如,使用std::sort,最好使用lambda。

#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

struct employee {
   int social_security_id;
   int date_of_birth;
   string first_name;
   string last_name;
   string state;
};

// parses and returns a vector of employees from the given stream.
std::vector<employee> parse_employees(ifstream ifs)
{
   std::string str;
   std::vector<employee> v;

   while (!ifs.eof()) {
      employee e;

      ifs >> e.social_security_id >> e.date_of_birth >> e.first_name >> e.last_name >> e.state;

      v.push_back(e);
   }

   return v;
}

int main(int argc, char* argv[])
{
   ifstream ifs("/home/www/class/een118/labs/database1.txt");
   auto employees = parse_employees(ifs);

   std::sort( std::begin(employees), std::end(employees),
      []( const employees &a, const employees &b )
      {
         return ( a.date_of_birth > b.date_of_birth );
      });

   for (auto e : v) {
      cout << e.social_security_id << e.date_of_birth << e.first_name << e.last_name << endl;
   }
}