C++ //例13.16 有5个学生数据,要求:(1) 把它们存到磁盘文件中;(2) 将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来;(3) 将第3个学生的数据修改后存回磁盘文件中的原有位置

C++程序设计 (第三版) 谭浩强 例13.16

例13.16 有5个学生数据,要求:

(1) 把它们存到磁盘文件中;

(2) 将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来;

(3) 将第3个学生的数据修改后存回磁盘文件中的原有位置。

(4) 从磁盘文件读入修改后的5个学生的数据并显示出来。

IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块:
说明:文件f1.bin在程序源文件同目录下。
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <limits>
using namespace std;

const int N = 5;

typedef struct Student{
    
    
	char gender;
	char name[20];
	int num;
	int age;
}Student;

//初始化学生结构体
void initialStu(Student **stu, int n){
    
    
	*stu = new Student[n+1];
}

//释放学生结构体
void freeStu(Student **stu){
    
    
	delete[] (*stu);
}

//输入学生信息
void inputStu(Student *stu, int n){
    
    
	cout<<"Enter "<<n<<" Student Info:"<<endl;
	for(int i = 0; i < n; i++){
    
    
		cout<<"Enter No."<<i + 1<<" Student Number(100 ~ 999): ";
		cin>>stu[i].num;
		while(stu[i].num < 100 || stu[i].num > 999){
    
    
			cout<<"Number Error! Retry!\nEnter No."<<i + 1<<" Student Number(100 ~ 999): ";
			cin>>stu[i].num;
		}
		
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
		cout<<"Enter No."<<i + 1<<" Student Name: ";
		gets(stu[i].name);
		
		cout<<"Enter No."<<i + 1<<" Student Age(18 ~ 30): ";
		cin>>stu[i].age;
		while(stu[i].age < 18 || stu[i].age > 30){
    
    
			cout<<"Age Error! Retry!\nEnter No."<<i + 1<<" Student Age(18 ~ 30): ";
			cin>>stu[i].age;
		}

		cout<<"Enter No."<<i + 1<<" Student Gender(M or F): ";
		cin>>stu[i].gender;
		while(stu[i].gender != 'M' && stu[i].gender != 'F'){
    
    
			cout<<"Gender Error! Retry!\nEnter No."<<i + 1<<" Student Gender(M or F): ";
			cin>>stu[i].gender;
		}
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
		cout<<endl;
	}
	cout<<endl;
}

//将学生信息存入文件
void inputFile(char *name, Student *stu, int n){
    
    
	fstream outfile(name, ios::out | ios::binary);
	if(!outfile){
    
    
		cerr<<"Open File "<<name<<" Error!"<<endl;
		system("pause");
		exit(1);
	}

	for(int i = 0; i < n; i++){
    
    
		outfile.write(reinterpret_cast<char*>(&stu[i]), sizeof(Student));
	}
	outfile.close();
}

//从文件读取学生信息并输出
void outputFile(char *name, Student *stu, int n){
    
    
	fstream infile(name, ios::in | ios::binary);
	if(!infile){
    
    
		cerr<<"Open File "<<name<<" Error!"<<endl;
		system("pause");
		exit(1);
	}

	for(int i = 0; i < n; i++){
    
    
		infile.read(reinterpret_cast<char*>(&stu[i]), sizeof(Student));
	}

	cout<<"Student Info:"<<endl;
	for(int i = 0; i < n; i++){
    
    
		cout<<setiosflags(ios::left);
		cout<<"Number: "<<setw(3)<<stu[i].num<<" Name: "<<setw(10)<<stu[i].name
			<<" Age: "<<setw(2)<<stu[i].age<<" Gender: "<<setw(1)<<stu[i].gender<<endl;
	}
	cout<<endl;
	infile.close();
}

//输出第1,3,5个学生信息
void outputFile3Stu(char *name, Student *stu, int n){
    
    
	fstream infile(name, ios::in | ios::binary);
	if(!infile){
    
    
		cerr<<"Open File "<<name<<" Error!"<<endl;
		system("pause");
		exit(1);
	}

	cout<<"Student 1, 3, 5 Info:"<<endl;
	for(int i = 0; i < n; i += 2){
    
    
		infile.seekg(i *sizeof(Student), ios::beg);
		infile.read(reinterpret_cast<char*>(&stu[i/2]), sizeof(Student));
		cout<<setiosflags(ios::left);
		cout<<"Number: "<<setw(3)<<stu[i/2].num<<" Name: "<<setw(10)<<stu[i/2].name
			<<" Age: "<<setw(2)<<stu[i/2].age<<" Gender: "<<setw(1)<<stu[i/2].gender<<endl;
	}
	cout<<endl;
	infile.close();
}

//修改指定学生信息
void editStuFile(char *name, Student *stu, int n, int num){
    
    
	Student newStu;
	cout<<"Enter Edit Student Info: "<<endl;
	cout<<"Enter No."<<num<<" Student New Number(100 ~ 999): ";
	cin>>newStu.num;
	while(newStu.num < 100 || newStu.num > 999){
    
    
		cout<<"Number Error! Retry!\nEnter No."<<num<<" Student New Number(100 ~ 999): ";
		cin>>newStu.num;
	}
		
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	cout<<"Enter No."<<num<<" Student New Name: ";
	gets(newStu.name);

	cout<<"Enter No."<<num<<" Student New Age(18 ~ 30): ";
	cin>>newStu.age;
	while(newStu.age < 18 || newStu.age > 30){
    
    
		cout<<"Age Error! Retry!\nEnter No."<<num<<" Student New Age(18 ~ 30): ";
		cin>>newStu.age;
	}

	cout<<"Enter No."<<num<<" Student New Gender(M or F): ";
	cin>>newStu.gender;
	while(newStu.gender != 'M' && newStu.gender != 'F'){
    
    
		cout<<"Gender Error! Retry!\nEnter No."<<num<<" Student New Gender(M or F): ";
		cin>>newStu.gender;
	}
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	cout<<endl;

	fstream iofile(name, ios::in | ios::out | ios::binary);
	if(!iofile){
    
    
		cerr<<"Open File "<<name<<" Error!"<<endl;
		system("pause");
		exit(1);
	}

	iofile.seekg(2 * sizeof(stu[0]), ios::beg);
	iofile.write(reinterpret_cast<char*>(&newStu), sizeof(Student));
	iofile.close();
}

int main(){
    
    
	Student *stu = NULL;
	
	initialStu(&stu, N);

	inputStu(stu, N);
	inputFile("f1.bin", stu, N);
	outputFile("f1.bin", stu, N);
	outputFile3Stu("f1.bin", stu, N);
	editStuFile("f1.bin", stu, N, 3);
	outputFile("f1.bin", stu, N);

	freeStu(&stu);

	system("pause");
	return 0;
}
结果显示如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/navicheung/article/details/135332293