设有学生信息如下:学号(长整型、姓名(字符型数组)、出生日期(含年、月、日,均为整型)。从键盘输入10个学生信息,写入硬盘的某个目录下名为“student.dat”的二进制数据文件中。然后再读取该文件前5名学生的信息,输出每个学生的学号、姓名及年龄(当前计算机年份减去出生年份)。
时间: 2024-02-18 13:04:12 浏览: 129
好的,这是一个关于文件读写和日期计算的问题,我来帮你解答。
首先,我们需要定义一个学生信息结构体,包含学号、姓名和出生日期三个字段。代码如下:
```c++
struct Student {
long long id; // 学号
char name[20]; // 姓名
int year, month, day; // 出生日期:年、月、日
};
```
接下来,我们需要编写写入和读取二进制文件的函数。写入函数将会接收一个学生信息数组和一个文件名作为参数,将学生信息写入到指定文件中。读取函数将会读取指定文件中的前5个学生信息,并输出学号、姓名和年龄。代码如下:
```c++
#include <iostream>
#include <fstream>
#include <ctime>
#include <cmath>
using namespace std;
// 定义学生信息结构体
struct Student {
long long id; // 学号
char name[20]; // 姓名
int year, month, day; // 出生日期:年、月、日
};
// 写入学生信息到文件
void writeToFile(Student students[], int n, string filename) {
// 打开文件,以二进制写入方式写入数据
ofstream outfile(filename, ios::binary);
if (!outfile) {
cerr << "Failed to open file " << filename << " for writing" << endl;
return;
}
// 写入学生信息
for (int i = 0; i < n; i++) {
outfile.write((char*)&students[i], sizeof(Student));
}
// 关闭文件
outfile.close();
}
// 读取文件中的学生信息
void readFromFile(string filename) {
// 打开文件,以二进制读取方式读取数据
ifstream infile(filename, ios::binary);
if (!infile) {
cerr << "Failed to open file " << filename << " for reading" << endl;
return;
}
// 读取前5个学生信息
Student student;
for (int i = 0; i < 5; i++) {
infile.read((char*)&student, sizeof(Student));
if (infile.eof()) break;
// 输出学生信息
cout << "学号:" << student.id << ",姓名:" << student.name << ",年龄:" << getAge(student.year) << endl;
}
// 关闭文件
infile.close();
}
// 计算年龄
int getAge(int birthYear) {
time_t now = time(0);
struct tm t;
t = *localtime(&now);
int currentYear = t.tm_year + 1900;
int age = currentYear - birthYear;
return age;
}
int main() {
// 从键盘读取学生信息
Student students[10];
for (int i = 0; i < 10; i++) {
cout << "请输入第" << i + 1 << "个学生的学号、姓名和出生日期(格式:yyyy mm dd):";
cin >> students[i].id >> students[i].name >> students[i].year >> students[i].month >> students[i].day;
}
// 写入学生信息到文件
writeToFile(students, 10, "student.dat");
// 读取前5个学生信息并输出学号、姓名和年龄
cout << "前5名学生信息如下:" << endl;
readFromFile("student.dat");
return 0;
}
```
这段代码中,我们定义了一个 `getAge` 函数,用于计算一个学生的年龄。该函数接收一个整型参数,表示学生的出生年份,使用 C++ 标准库中的时间函数来获取当前年份,然后计算出生年份与当前年份之间的差距,即为学生的年龄。在 `readFromFile` 函数中,我们使用一个 `Student` 结构体变量来读取文件中的学生信息,然后将出生年份传递给 `getAge` 函数来计算年龄。
最后,我们从键盘读取10个学生信息,调用 `writeToFile` 函数将学生信息写入到文件中,再调用 `readFromFile` 函数读取前5名学生信息并输出学号、姓名和年龄。
阅读全文