c++实训:从文本文件创建可随机访问的二进制文件

任务要求:

  1. 完成函数stu_sort:实现按成绩从高到低对Student对象数组s的排序 void stu_sort(Student s[], int size);

  2. 完成函数creatDatfile:将学生信息按序写入二进制文件中。 void createDatfile(char* txtfilename, char *datfilename) 该函数首先读取文本文件txtfilename,将数据保存到Student类的对象数组stu[10]中(本题做了简化处理,假设文本文件中有且只有10个学生信息) 然后调用函数stu_sort(), 对stu[10]排序。 最后将排好序的stu数组,写入二进制文件 datfilename中

  3. 完成函数getRankN:从学生信息的二进制文件datfilename中读取第n名并返回

    Student getRankN(char *datfilename, int n);

 

 实训代码(平台里面自动生成测试文件)

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include "testdatfile.h"

using namespace std;

class Student{
   public:
       void setStu(int, char*, float);
       float getScore();
       void print();
   private:
       int id;
       char name[30];
       float  score;
};


void stu_sort(Student s[], int size);  // 按成绩从高到低对Student对象数组s排序, 数组长度为size
void createDatfile(const char* txtfilename, const char *datfilename); // 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
Student getRankN(const char *datfilename, int n);//从学生信息的二进制文件datfilename中读取第n名并返回

int main()
{
   Student stu;
   int n;
   generatetestfile(); // 产生score.txt文件数据, 平台测试用

   createDatfile("score.txt", "rank.dat");// 从文本文件score.txt中读取10个学生信息入二进制文件rank.dat中
    

   cin >> n;  // 由用户输入想查询第几名
   stu = getRankN("rank.dat", n); // 从rank.dat中读取第n名
   stu.print(); //显示第n名的信息 

}
// 根据成绩从高到低对Student数组排序
void stu_sort(Student s[], int size)
{
    /***********begin**********/
    for(int i=0; i<size-1;i++)
  { 
      for (int j=0; j<size-i-1;j++) 
       { 
           if(s[j].getScore()<s[j+1].getScore()) 
           { 
           Student temp=s[j]; 
           s[j]=s[j+1]; 
           s[j+1]=temp; 
           }
        }
   } 
    /********end************/
}

// 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
void createDatfile(const char* txtfilename, const char *datfilename)
{
 /***********begin*********/
  
  Student s[10]; 
   ifstream is(txtfilename); 
   if (!is)
    { 
        cerr << "Open file " << txtfilename << " failed." << endl; exit(EXIT_FAILURE); 
   } 
   int id; 
   char name[30]; 
   float score; 
   for (int i = 0; i < 10; ++i) 
   { 
       is >> id >> name >> score; 
       s[i].setStu(id, name, score); 
   }
    is.close(); 
    stu_sort(s, 10); 
    ofstream os(datfilename, ios::binary); 
    if (!os) 
    { 
        cerr << "Open file " << datfilename << " failed." << endl;
        exit(EXIT_FAILURE); 
    } 
    for (int i = 0; i < 10; ++i) 
    { 
        os.write(reinterpret_cast<const char*>(&s[i]), 
        sizeof(Student)); 
    }
        os.close(); 
    /************end****************/
}

//从学生信息的二进制文件datfilename中读取第n名并返回
Student getRankN(const char * datfilename, int n)
{
    /***********begin*********/
  Student stu;
  ifstream is(datfilename, ios_base::in|ios_base::binary);
  is.seekg((n-1) * sizeof(Student));
  is.read(reinterpret_cast <char *> (&stu), sizeof(Student));
  is.close();
  return stu;  
    /************end****************/
}


//类 student的成员函数
void Student :: setStu(int d, char *n, float s)
{
    id = d;
    strcpy(name, n);
    score = s;
}

float Student :: getScore()
{
   return score;
}

void Student::print()
{
    cout << id << ' ' << name << ' '<< score << endl;
}

 如果想在编程软件(本人使用vs2010)里实现此功能,则需自己创建score.txt文件

 代码如下:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>

using namespace std;

class Student{
   public:
       void setStu(int, char*, float);
       float getScore();
       void print();
   private:
       int id;
       char name[30];
       float  score;
};


void stu_sort(Student s[], int size);  // 按成绩从高到低对Student对象数组s排序, 数组长度为size
void createDatfile(const char* txtfilename, const char *datfilename); // 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
Student getRankN(const char *datfilename, int n);//从学生信息的二进制文件datfilename中读取第n名并返回

int main()
{
   Student stu;
   int n;
   createDatfile("score.txt", "rank.dat");// 从文本文件score.txt中读取10个学生信息入二进制文件rank.dat中
   cin >> n;  // 由用户输入想查询第几名
   stu = getRankN("rank.dat", n); // 从rank.dat中读取第n名
   stu.print(); //显示第n名的信息 

}
// 根据成绩从高到低对Student数组排序
void stu_sort(Student s[], int size)
{
    for(int i=0; i<size-1;i++)
  { 
      for (int j=0; j<size-i-1;j++) 
       { 
           if(s[j].getScore()<s[j+1].getScore()) 
           { 
           Student temp=s[j]; s[j]=s[j+1]; 
           s[j+1]=temp; 
           }
        }
   } 
}

// 从文本文件txtfilename中读取10个学生信息到Student 对象数组s中, 并以Student对象数组的形式写入二进制文件datfilename中
void createDatfile(const char* txtfilename, const char *datfilename)
{
  Student s[10]; 
   ifstream is(txtfilename); 
   if (!is)
    { 
        cerr << "Open file " << txtfilename << " failed." << endl; exit(EXIT_FAILURE); 
   } 
   int id; 
   char name[30]; 
   float score; 
   for (int i = 0; i < 10; ++i) 
   { 
       is >> id >> name >> score; 
       s[i].setStu(id, name, score); 
   }
    is.close();
    stu_sort(s, 10); 
    ofstream os(datfilename, ios::binary); 
    if (!os) 
    { 
        cerr << "Open file " << datfilename << " failed." << endl;
        exit(EXIT_FAILURE); 
    } 
    for (int i = 0; i < 10; ++i) 
    { 
        os.write(reinterpret_cast<const char*>(&s[i]), 
        sizeof(Student)); 
    }
        os.close(); 
}

//从学生信息的二进制文件datfilename中读取第n名并返回
Student getRankN(const char * datfilename, int n)
{
  Student stu;
  ifstream is(datfilename, ios_base::in|ios_base::binary);
  is.seekg((n-1) * sizeof(Student));
  is.read(reinterpret_cast <char *> (&stu), sizeof(Student));
  is.close();
  return stu;  
}


//类 student的成员函数
void Student :: setStu(int d, char *n, float s)
{
    id = d;
    strcpy(name, n);
    score = s;
}

float Student :: getScore()
{
   return score;
}

void Student::print()
{
    cout << id << ' ' << name << ' '<< score << endl;
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值