C++文件读写之对象的读写

   这里以一个简单的学生信息管理系统为例。

  首先是对象的建立,包括姓名,学号,成绩,学分,等

  如下:

  这里面包括两个子对象,

 1 class Student
 2 {
 3 public:
 4     Student() :score(), birthday(){}//对子对象进行初始化
 5     ~Student(){}
 6     void InputInfo();
 7     void OutPutInfo();
 8     void ShowInfo();
 9     bool CreditManage();
10 
11     char *getNum(){ return num; }
12     char *getName(){ return name; }
13     bool getSex(){ return sex; }
14     float GetCredit(){ return credit; }
15     void swapStudent(Student &stu);
16 private:
17     char  num[10];
18     char name[20];
19     bool sex;
20     Score score;//子对象
21     Birthday birthday;//子对象
22     float credit;
23     bool isChanged;
24 };

  然后主要还是文件读写。文件读写包括三个类,其中ifstream和ofstrean从fstream派生而来,可以在创建对象的时候直接初始化,这样比较方便。也可以使用open函数打开文件

    (1) ifstream类,它是从istream类派生的。用来支持从磁盘文件的输入。

    (2) ofstream类,它是从ostream类派生的。用来支持向磁盘文件的输出。

    (3) fstream类,它是从iostream类派生的。用来支持对磁盘文件的输入输出。

  其中的文件读写的关键函数是read和write,这两个函数可以读写固定长度的数据

      istream& read(char *buffer,int len);

      ostream& write(const char * buffer,int len);

  文件操作完毕一定要关闭文件,只需调用close()就行。

  如file.close();

  定义一个全局函数用于获取文件中对象的个数,

 1 int GetNumberFromFile()
 2 {
 3     int count = 0;//对象个数,即学生人数
 4     fstream infile("e:\student.txt",ios::in | ios::binary);//以读方式打开文件
 5     if (!infile)
 6     {
 7         cout<<"open file error!"<<endl;
 8         getchar();
 9         exit(0);
10     }
11     Student stu;
12     while (infile.read((char*)&stu,sizeof(stu)))//强制类型转换为(char*),
13     {
14         count++;
15     }
16     infile.close();
17     return count;
18 }

  这里的文件读写关键是在read函数,read函数会读取数据一直到文件结束

1 basic_istream<Elem, Tr>& read(
2     char_type *_Str, //这里是要保存的对象数组的地址
3     streamsize _Count//这里是对象的大小
4 );

  因为数据是以二进制保存到文件中的,所以我们不用关心数据的格式,我们知道怎么读取数据就行了。向文件中写入整个对象的好处是将来可以整个读取出来进行操作,不必去考虑细节。

  写入文件和这个类似

1             Student stu1;
2             stu1.InputInfo();
3             fstream outfile("e:\student.txt", ios::app | ios::binary);//这里以app方式打开文件进行添加
4             if (!outfile)
5             {
6                 cerr << "open file error!";
7             }
8             outfile.write((char*)&stu1, sizeof(stu1));
9             outfile.close();
以app方式打开文件进行添加,文件内部的位置指针会自动移动移动到文件末尾,直接添加文件到最后。

  当对文件进行输出时

 1             fstream infile("e:\student.txt",ios::in | ios::binary);
 2             if (!infile)
 3             {
 4                 cout<<"open file error!"<<endl;
 5                 getchar();
 6                 //exit(0);
 7             }
 8             int len = 0;
 9             len = GetNumberFromFile();
10             if (len == 0)
11             {
12                 cout << "no data!" << endl;
13                 ch = '0';
14                 break;
15             }
16             Student *stu = new Student[len];//动态申请地址,因为这个数组大小是在运行过程中才能知道的
17             cout << "number	name	sex	year-month-day	credit" << endl;            
18             for (int i = 0; i < len;i++)
19             {
20                 infile.read((char*)&stu[i], sizeof(stu[i]));
21                 stu[i].OutPutInfo();
22             }
23             delete []stu;
24             infile.close();

  

 还有一些排序的简单实现在下面的代码中

整个程序代码在这里

  1 #include <iostream>
  2 #include "string"
  3 using namespace std;
  4 
  5 class Student;
  6 bool SortByCondition(Student stu[],const int &len,const char &conditon);//排序
  7 void SaveToFile(Student stu[],int num);
  8 void ReadFromFile(Student stu[],int num);
  9 int GetNumberFromFile();
 10 char Menu();
 11 char SortMenu();
 12 
 13 class Score
 14 {
 15 public:
 16     Score(){ english = 0, math = 0; computer = 0; }
 17     Score(float eng, float mat, float com) :english(eng), math(mat), computer(com){}
 18     void InputScore()
 19     {
 20         cout << "enter english  score:";
 21         cin>> english;
 22         cout << "enter math     score:";
 23         cin >> math;
 24         cout << "enter computer score:";
 25         cin >> computer;
 26     }
 27     void outputScore()
 28     {
 29         cout << english << "	" << math << "	" << computer << "	";
 30     }
 31     float ScoreSum()
 32     {
 33         return (math + english + computer);
 34     }
 35     void swapScore(Score &scor)//对象交换数据
 36     {
 37         float ftmp = english;
 38         english = scor.english;
 39         scor.english = ftmp;
 40 
 41         ftmp = math;
 42         math = scor.math;
 43         scor.math = ftmp;
 44         
 45         ftmp = computer;
 46         computer = scor.computer;
 47         scor.computer = ftmp;
 48     }
 49 private:
 50     float english;
 51     float math;
 52     float computer;
 53 };
 54 
 55 class Birthday
 56 {
 57 public:
 58     Birthday(){ year = 0; month = 0; day = 0; }
 59     Birthday(int ye, int mon, int da) :year(ye), month(mon), day(da){}
 60     void inputBirthday()
 61     {
 62         cout << "enter birthday like "2014 05 01":" << endl;
 63         cin >> year >> month >> day;
 64     }
 65     void outputBirthday()
 66     {
 67         cout << year << "-" << month << "-" << day << "	";
 68     }
 69     void swapBirthday(Birthday &bir)//对象交换数据
 70     {
 71         int itmp = year;
 72         year = bir.year;
 73         bir.year = itmp;
 74 
 75         itmp = month;
 76         month = bir.month;
 77         bir.month = itmp;
 78 
 79         itmp = day;
 80         day = bir.day;
 81         bir.day = itmp;
 82     }
 83 private:
 84     int year;
 85     int month;
 86     int day;
 87 };
 88 
 89 
 90 class Student
 91 {
 92 public:
 93     Student() :score(), birthday(){}
 94     ~Student(){}
 95     void InputInfo();
 96     void OutPutInfo();
 97     void ShowInfo();
 98     bool CreditManage();
 99 
100     char *getNum(){ return num; }
101     char *getName(){ return name; }
102     bool getSex(){ return sex; }
103     float GetCredit(){ return credit; }
104     void swapStudent(Student &stu);//对象交换数据
105 private:
106     char  num[10];
107     char name[20];
108     bool sex;
109     Score score;
110     Birthday birthday;
111     float credit;
112     bool isChanged;
113 };
student.h
  1 #include "student.h"
  2 #include "iostream"
  3 #include "fstream"
  4 using namespace std;
  5 
  6 
  7 void Student::InputInfo()
  8 {
  9     cout << "enter number(字符串)";
 10     cin >> num;
 11     cout << "enter name(字符串)";
 12     cin >> name;
 13     cout << "enter sex(0表示女,1表示男)";
 14     cin >> sex;
 15     score.InputScore();
 16     birthday.inputBirthday();
 17     credit = score.ScoreSum() / 10;//计算得出学分
 18 }
 19 
 20 void Student::OutPutInfo()
 21 {
 22     cout << num << "	" << name << "	" << sex << "	";
 23     //score.outputScore();
 24     birthday.outputBirthday();
 25     cout << credit << endl;
 26 }
 27 
 28 char Menu()
 29 {
 30     //system("cls");
 31     cout << "******************************************" << endl;
 32     cout << "***welcome to student management system***" << endl;
 33     cout << "******************************************" << endl;
 34     cout << "please choose the number below:" << endl;
 35     cout << "1--成绩录入" << endl;
 36     cout << "2--成绩显示" << endl;
 37     cout << "3--排序管理" << endl;
 38     cout << "4--学分管理" << endl;
 39     cout << "0--退出" << endl;
 40     char ch = getchar();
 41     return ch;
 42 }
 43 
 44 void Student::swapStudent(Student &stu)
 45 {
 46     char tmp[10];
 47     strcpy_s(tmp, num);
 48     strcpy_s(num, stu.num);
 49     strcpy_s(stu.num, tmp);
 50 
 51     char nam[20];
 52     strcpy_s(nam, name);
 53     strcpy_s(name, stu.name);
 54     strcpy_s(stu.name, nam);
 55 
 56     bool btmp = sex;
 57     sex = stu.sex;
 58     stu.sex = btmp;
 59 
 60     score.swapScore(stu.score);
 61     birthday.swapBirthday(stu.birthday);
 62 
 63     float ftmp = credit;
 64     credit = stu.credit;
 65     stu.credit = ftmp;
 66 
 67     btmp = isChanged;
 68     isChanged = stu.isChanged;
 69     stu.isChanged = btmp;
 70 
 71 }
 72 
 73 char SortMenu()
 74 {
 75     cout << "选择要进行排序的方式:";
 76     cout << "1--学号" << endl;
 77     cout << "2--姓名" << endl;
 78     cout << "3--性别" << endl;
 79     cout << "4--学分" << endl;
 80     cout << "5--返回上一级" << endl;
 81     getchar();
 82     char ch = getchar();
 83     return ch;
 84 }
 85 
 86 bool SortByCondition(Student stu[], const int &len, const char &conditon)//排序
 87 {
 88     char tmp = conditon;
 89     int length = len;
 90     switch (tmp)
 91     {
 92     case '1'://学号
 93     {
 94         for (int i = 0; i < length; i++)
 95         {
 96             for (int j = 0; j < length-i-1; j++)
 97             {
 98                 if (strcmp((stu[j].getNum()), stu[j + 1].getNum()) > 0)
 99                 //if (stu[j].getName().compare(stu[j+1].getName()) > 0)
100                 {
101                     //compare(stu[j].getName(),stu[j+1].getName());
102                     //stu[j].getName().compare(stu[j+1].getName());
103                     stu[j].swapStudent(stu[j + 1]);
104                 }
105             }
106         }
107         cout << "学号降序排列" << endl;
108         for (int i = 0; i < length; i++)
109         {
110             stu[i].OutPutInfo();
111 //             if (i % 10 == 0)
112 //             {
113 //                 cout << "按下任意键继续显示" << endl;
114 //                 getchar();
115 //             }
116         }
117         getchar();
118     }
119         break;
120     case '2'://姓名
121     {
122         for (int i = 0; i < length; i++)
123         {
124             for (int j = 0; j < length - i - 1; j++)
125             {
126                 if (strcmp(stu[j].getName(), stu[j + 1].getName()) < 0)
127                 //if (stu[j].getNum().compare(stu[j+1].getNum()) > 0)
128                 {
129                     stu[j].swapStudent(stu[j + 1]);
130                 }
131             }
132         }
133         cout << "姓名降序排列" << endl;
134 
135         for (int i = 0; i < length; i++)
136         {
137             stu[i].OutPutInfo();
138 //             if (i % 10 == 0)
139 //             {
140 //                 cout << "按下任意键继续显示" << endl;
141 //                 getchar();
142 //             }
143         }
144         getchar();
145     }
146         break;
147     case '3'://性别
148     {
149         for (int i = 0; i < length; i++)
150         {
151             for (int j = 0; j < length - i - 1; j++)
152             {
153                 if (stu[j].getSex() < stu[j + 1].getSex())
154                 {
155                     stu[j].swapStudent(stu[j + 1]);
156                 }
157             }
158         }
159             cout << "性别降序排列" << endl;
160         for (int i = 0; i < length; i++)
161         {
162             stu[i].OutPutInfo();
163 //             if (i % 10 == 0)
164 //             {
165 //                 cout << "按下任意键继续显示" << endl;
166 //                 getchar();
167 //             }
168         }
169         getchar();
170     }
171         break;
172 
173     case '4'://学分
174     {
175         for (int i = 0; i < length; i++)
176         {
177             for (int j = 0; j < length - i - 1; j++)
178             {
179                 if (stu[j].GetCredit() < stu[j + 1].GetCredit())
180                 {
181                     stu[j].swapStudent(stu[j + 1]);
182                 }
183             }
184         }
185         cout << "学分降序排列" << endl;
186         for (int i = 0; i < length; i++)
187         {
188             stu[i].OutPutInfo();
189 //             if (i % 10 == 0)
190 //             {
191 //                 cout << "按下任意键继续显示" << endl;
192 //                 getchar();
193 //             }
194         }
195         getchar();
196     }
197         break;
198     default:
199         break;
200     }
201     return true;
202 }
203 
204 int GetNumberFromFile()
205 {
206     int count = 0;//对象个数,即学生人数
207     fstream infile("e:\student.txt",ios::in | ios::binary);
208     if (!infile)
209     {
210         cout<<"open file error!"<<endl;
211         getchar();
212         exit(0);
213     }
214     Student stu;
215     while (infile.read((char*)&stu,sizeof(stu)))
216     {
217         count++;
218     }
219     infile.close();
220     return count;
221 }
student.cpp
  1 #include "student.h"
  2 #include "fstream"
  3 #include "string"
  4 
  5 int main()
  6 {
  7     char ch = Menu();
  8     int  quit = 1;
  9     while (quit)
 10     {
 11         switch (ch)
 12         {
 13         case '1'://成绩录入
 14         {
 15             Student stu1;
 16             stu1.InputInfo();
 17             fstream outfile("e:\student.txt", ios::app | ios::binary);
 18             if (!outfile)
 19             {
 20                 cerr << "open file error!";
 21             }
 22             outfile.write((char*)&stu1, sizeof(stu1));
 23             outfile.close();
 24 
 25             ch = '0';
 26             getchar();
 27         }
 28             break;
 29         case '2'://成绩显示
 30         {
 31             fstream infile("e:\student.txt",ios::in | ios::binary);
 32             if (!infile)
 33             {
 34                 cout<<"open file error!"<<endl;
 35                 getchar();
 36                 //exit(0);
 37             }
 38             int len = 0;
 39             len = GetNumberFromFile();
 40             if (len == 0)
 41             {
 42                 cout << "no data!" << endl;
 43                 ch = '0';
 44                 break;
 45             }
 46             Student *stu = new Student[len];
 47             cout << "number	name	sex	year-month-day	credit" << endl;            
 48             for (int i = 0; i < len;i++)
 49             {
 50                 infile.read((char*)&stu[i], sizeof(stu[i]));
 51                 stu[i].OutPutInfo();
 52             }
 53             delete []stu;
 54             infile.close();
 55             ch = '0';
 56             getchar();
 57         }
 58             break;
 59         case '3'://排序管理
 60         {
 61             char condtion = SortMenu();
 62             fstream file("e:\student.txt", ios::in | ios::binary);
 63             if (!file)
 64             {
 65                 cerr << "open file error!";
 66             }
 67             int len = GetNumberFromFile();
 68             Student *stu = new Student[len];
 69             for (int i = 0; i < len;i++)
 70             {
 71                 file.read((char *)&stu[i], sizeof(stu[i]));
 72             }
 73         
 74             file.close();
 75             SortByCondition(stu,len, condtion);
 76 
 77 
 78             delete []stu;
 79             getchar();
 80         }
 81             break;
 82 
 83         case '4'://学分管理
 84         {
 85 
 86         }
 87             break;
 88 
 89         case '0':
 90         {
 91             quit = 0;
 92             exit(0);
 93             ch = '0';//quit switch
 94         }
 95             break;
 96         default:
 97             //ch = '0';
 98             break;
 99         }
100         //getchar();
101 
102         ch = Menu();
103     }
104     system("pause");
105     return 0;
106 }
main.cpp
原文地址:https://www.cnblogs.com/songliquan/p/3708137.html