设有学生信息如下:学号 姓名 出生日期。从键盘输入10个学生信息,写入硬盘的某个目录名下的二进制数据文件中。然后读取前5名学生信息,输出每个学生的学号 姓名及年龄
时间: 2024-02-18 14:04:07 浏览: 78
好的,这是一个涉及文件读写和日期计算的问题,我来帮你解答。
首先,我们需要定义一个学生信息结构体,包含学号、姓名和出生日期三个字段。代码如下:
```c++
struct Student {
int id; // 学号
string name; // 姓名
string birthday; // 出生日期(字符串类型)
};
```
接下来,我们需要编写写入和读取二进制文件的函数。写入函数将会接收一个学生信息数组和一个文件名作为参数,将学生信息写入到指定文件中。读取函数将会读取指定文件中的前5个学生信息,并输出学号、姓名和年龄。代码如下:
```c++
#include <iostream>
#include <fstream>
#include <ctime>
#include <cmath>
using namespace std;
// 定义学生信息结构体
struct Student {
int id; // 学号
string name; // 姓名
string birthday; // 出生日期(字符串类型)
};
// 写入学生信息到文件
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.birthday) << endl;
}
// 关闭文件
infile.close();
}
// 计算年龄
int getAge(string birthday) {
time_t now = time(0);
struct tm t;
int year, month, day;
sscanf(birthday.c_str(), "%d-%d-%d", &year, &month, &day);
t.tm_year = year - 1900;
t.tm_mon = month - 1;
t.tm_mday = day;
t.tm_hour = 0;
t.tm_min = 0;
t.tm_sec = 0;
time_t birth = mktime(&t);
double diff = difftime(now, birth);
int age = (int)floor(diff / (365 * 24 * 60 * 60));
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].birthday;
}
// 写入学生信息到文件
writeToFile(students, 10, "students.bin");
// 读取前5个学生信息并输出学号、姓名和年龄
cout << "前5名学生信息如下:" << endl;
readFromFile("students.bin");
return 0;
}
```
这段代码中,我们定义了一个 `getAge` 函数,用于计算一个学生的年龄。该函数接收一个字符串类型的出生日期参数,使用 C++ 标准库中的时间函数来计算出生日期与当前日期之间的时间差,最后将时间差转换为年龄。在 `readFromFile` 函数中,我们使用一个 `Student` 结构体变量来读取文件中的学生信息,然后将出生日期传递给 `getAge` 函数来计算年龄。
最后,我们从键盘读取10个学生信息,调用 `writeToFile` 函数将学生信息写入到文件中,再调用 `readFromFile` 函数读取前5名学生信息并输出学号、姓名和年龄。
阅读全文