zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    启动窗体的程序控制与动画效果
    在线程中使用定时器
    从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中
    收集:PowerDesigner常见问题解决与设置集锦
    [转]C# 2.0新特性与C# 3.5新特性
    COM服务器的创建过程
    [原创] 为什么需要TLS(Thread Local Storage)?
    COM+服务器的.Net组件实现 客户端
    如何在客户端避免繁冗的服务器GUID定义及导入?
    进程、线程、套间和环境
  • 原文地址:https://www.cnblogs.com/songliquan/p/3708137.html
Copyright © 2011-2022 走看看