HM145 二进制人员档案

HM145 二进制人员档案

HM145 二进制人员档案

来源: 第 145 集 C++文件操作-二进制文件-写文件

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

要把若干名员工的档案落到磁盘文件 person.txt 上。这次不用文本插入,而用**二进制写出**。用记事本直接打开时,姓名后面往往跟着看不懂的字节,这是正常现象:只要按同样的二进制方式读回来,姓名和年龄仍然正确即可。

二进制写出不但能处理 intdoublefloat 这类内置类型,也能把自定义类型整块写入。本题操作的是人员类型 Person,必须按下面规则实现,不能只把输入原样打印出去:

  1. 包含 <fstream>,用输出流对象 ofstream 写文件。写文件固定五步:包含头文件、创建流对象、打开文件、写入、关闭。
  2. 打开方式必须同时指定“写出”和“二进制”,并用按位或组合:ios::out | ios::binary。既可以先构造流对象再调用 open,也可以在构造 ofstream 时一次性传入路径和打开方式,两种写法都可以。
  3. Person 里姓名必须用长度为 \(64\) 的字符数组(不要把 string 对象整块写入,底层文件接口按 C 风格字节处理更稳妥),另有一个 int 年龄。
  4. 写入时调用 write:第一个参数是记录首地址,需要转换成 const char*(对 Person 对象取地址得到的是 Person*,与函数原型不符,必须强转);第二个参数是要写的字节数,使用 sizeof(Person)
  5. 写完后必须 close 关闭文件。只写不读时屏幕上不会自动出现内容,数据已经在磁盘上。
  6. 再按二进制方式打开同一文件,读回全部记录,按询问输出。评测只检查读回后的姓名和年龄。

输入格式

第一行一个整数 \(n\)(\(1 \le n \le 100\)),表示员工人数。

接下来 \(n\) 行,每行一个不含空白的姓名 \(s\) 和一个整数年龄 \(a\)(\(1 \le |s| \le 63\),\(1 \le a \le 150\))。

下一行一个整数 \(q\)(\(1 \le q \le 100\)),表示询问个数。

接下来 \(q\) 行,每行一个整数 \(k\)(\(1 \le k \le n\)),表示要查看第 \(k\) 名员工(从 \(1\) 编号)。

输出格式

对每个询问输出一行:姓名、一个空格、年龄,行末换行。姓名与年龄必须来自二进制文件读回的记录。

样例

输入 #1

2
ZhangSan 18
LiSi 20
3
1
2
1

输出 #1

ZhangSan 18
LiSi 20
ZhangSan 18

输入 #2

1
张三 18
1
1

输出 #2

张三 18

说明

  • 打开方式写成 ios::out | ios::binary,中间的 | 不能省略。
  • write 需要的是 const char* 与长度;对 Person 对象取地址后要做类型转换。
  • 用文本方式打开 person.txt 可能看到姓名后面跟着乱码,评测只检查按二进制读回后的输出。

信息

ID
1144
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者