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\tname\tsex\tyear-month-day\tcredit" << 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 << "\t" << math << "\t" << computer << "\t"; 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 << "\t"; 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 };
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 << "\t" << name << "\t" << sex << "\t"; 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 }
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\tname\tsex\tyear-month-day\tcredit" << 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 }
本文来自博客园,作者:struggle_time,转载请注明原文链接:https://www.cnblogs.com/songliquan/p/3708137.html