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();
}
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;
}
结果显示如下: