C++中如何让类排序?如何计算文件中类的对象的个数?
有一道这样的题目:编程实现以下功能:按职工号由小到大的顺序将五个员工的数据(包含号码,姓名,年龄,工资)输出到文件中保存这题如果用类staff来定义职工,那要怎样才能把这...
有一道这样的题目:
编程实现以下功能:
按职工号由小到大的顺序将五个员工的数据(包含号码,姓名,年龄,工资)输出到文件中保存
这题如果用类staff来定义职工,那要怎样才能把这几个对象按id来排序呢?可以像排序一组数那样用起泡法来排序吗?如果我打开这个文件,想把这个文件的内容输出到一个数组中,那这样就要知道文件中有多少个对象吧?那么要怎么计算文件中有多少个类对象呢?求高手解答!~~o(>_<)o ~~ 展开
编程实现以下功能:
按职工号由小到大的顺序将五个员工的数据(包含号码,姓名,年龄,工资)输出到文件中保存
这题如果用类staff来定义职工,那要怎样才能把这几个对象按id来排序呢?可以像排序一组数那样用起泡法来排序吗?如果我打开这个文件,想把这个文件的内容输出到一个数组中,那这样就要知道文件中有多少个对象吧?那么要怎么计算文件中有多少个类对象呢?求高手解答!~~o(>_<)o ~~ 展开
1个回答
展开全部
// 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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询