C++中如何让类排序?如何计算文件中类的对象的个数?

有一道这样的题目:编程实现以下功能:按职工号由小到大的顺序将五个员工的数据(包含号码,姓名,年龄,工资)输出到文件中保存这题如果用类staff来定义职工,那要怎样才能把这... 有一道这样的题目:
编程实现以下功能:
按职工号由小到大的顺序将五个员工的数据(包含号码,姓名,年龄,工资)输出到文件中保存

这题如果用类staff来定义职工,那要怎样才能把这几个对象按id来排序呢?可以像排序一组数那样用起泡法来排序吗?如果我打开这个文件,想把这个文件的内容输出到一个数组中,那这样就要知道文件中有多少个对象吧?那么要怎么计算文件中有多少个类对象呢?求高手解答!~~o(>_<)o ~~
展开
 我来答
shb8845369
推荐于2016-10-30 · TA获得超过280个赞
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:166万
展开全部

  

 // Staff.h
 class Staff
  {
      public:
          Staff(int number, CString name, int age, float salary);
          ~Staff();
          Staff& operator=(const Staff& otherStaff);
          void Init(int number, CString name, int age, float salary);
          inline int GetNumber(){return m_iNumber;}
          inline CString GetName(){return m_strName;}
          inline int GetAge(){return m_age;}
          inline float GetSalary(){return m_salary;}
          bool SaveToFile(File* filePtr,CString fullFilePath);
      private:
          int m_iNumber;
          CString m_strName;
          int m_age;
          float m_salary;
  };
  
 // Staff.cpp
 Staff::Staff(int number ,CString name, int age, float salary)
 {
        Init(number, name,age, salary);
 }
 
 void Staff::Init(int number, CString name, int age, float salary)
 {
    m_iNumber = number;
     m_strName = name;
     m_age = age;
     m_salary = salary;
 }
 
 Staff::~Staff()
 {
 
 }
 
 Staff& Staff::operator=(const Staff& otherStaff)
 {
     if(this == &otherStaff)
     {
         return *this;
     }
     m_iNumber = otherStaff.GetNumber();
     strcpy(m_strName, otherStaff.GetName());
     m_age = otherStaff.GetAge();
     m_salary = otherStaff.GetSalary();
     return *this;
 }
 
 bool Staff::SaveToFile(FILE* filePtr, CString fileFullPath)
 {
     if(filePtr != NULL)
     {
         // 每一个字符代表一个字节,以下输出为txt文档中的一行,每个字段用一个空格分隔开,下次读取txt文档的时候依靠空格分离各个字段
         fprintf(filePtr,"[staff number]=%-8d ",m_iNumber);
         fprintf(filePtr,"[staff name]=%s ",m_strName);
         fprintf(filePtr,"[staff age]=%-3d ", m_age);
         fprintf(filePtr,"[staff salary]=%f ",m_salary);
         fprintf(filePtr,"\n");    // 换行  
         return true;   
     }
     return false;
 }

 // main.cpp
 #include <iostream>
 #include "Staff.h"
 using namespace std;
 
 #define SAVE_FILE_PATH    _T("D:\StaffRecord.txt")
 #define STAFF_COUNT       10
 
 void main()
 {    
     // 初始化
     Staff staff[STAFF_COUNT];
     for(int i=0; i<STAFF_COUNT; i++)
     {
         staff[i].Init( i, _T("小王"), 22, 3300.0f);
       }
      
      // 排序     
     for(int i=0;i<STAFF_COUNT;i++)
         for(int j=1; j<STAFF_COUNT-i; j++)
         {
             if(staff[j-1].GetNumber() > staff[j].GetNumber)
             {
                 Staff tmp = staff[j];
                 staff[j] = staff[j-1];
                 staff[j-1] = tmp;
             }
         }
    
     // 保存员工数量
     FILE *pFileSave = fopen(SAVE_FILE_PATH,"a+");
     if(pFileSave != NULL);
     {
         fprintf(pFileSave,"Total Staff:%-5d\n",STAFF_COUNT);
     }
  
     // 保存员工记录
     for(int i=0; i<STAFF_COUNT; i++)
     {         
         staff[i].SaveToFile(pFileSave, SAVE_FILE_PATH);
     }  
     fclose(pFileSave); // 记得关闭文件
    
    // 读取员工数量
    FILE* ptrTxtFile;
    char countStrInFile[5];
    char countStrTotal[50];
    int staffCountFromFile = 0;
    ptrTxtFile = fopen(SAVE_FILE_PATH,"r");
    if(ptrTxtFile != NULL)
    {
        fseek(ptrTxtFile,0,SEEK_SET);
        fread(countStrInTotal,sizeof(char),5+13,ptrTxtFile);
        for(int i=0; i<5; i++)
        {
            countStrInFile[i] = countStrInTotal[11+i];
        }
        countStrInFile[5] = '\0';
        staffCountFromFile = atoi(countStrInFile);        
    }
    
    // new 出一个Staff数组
    Staff* pNewStaff = new Staff(staffCountFromFile);
    // 读取txt文件,初始化Staff数组
    FILE*U ptrFile;
    ptrFile = fopen(SAVE_FILE_PATH,"r");
    if(ptrFile != NULL)
    {
        for(int i=0; i<staffCountFromFile; i++)
        {
            // 这里逻辑比较复杂,只提供思路
            // 根据换行符"\n"我们可以获取一行数据
            // 根据空格""我们可以将一行数据中的各个字段进行分离
            // 读出来的数据都是字符串类型,因此需要转换数据类型
            // 数据转换完毕,开始赋值,赋值完毕,读取下一行数据
        }
     }
    return 0;
 }
 
  
  
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式