HM145 二进制人员档案
HM145 二进制人员档案
来源: 第 145 集 C++文件操作-二进制文件-写文件
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
要把若干名员工的档案落到磁盘文件 person.txt 上。这次不用文本插入,而用**二进制写出**。用记事本直接打开时,姓名后面往往跟着看不懂的字节,这是正常现象:只要按同样的二进制方式读回来,姓名和年龄仍然正确即可。
二进制写出不但能处理 int、double、float 这类内置类型,也能把自定义类型整块写入。本题操作的是人员类型 Person,必须按下面规则实现,不能只把输入原样打印出去:
- 包含
<fstream>,用输出流对象ofstream写文件。写文件固定五步:包含头文件、创建流对象、打开文件、写入、关闭。 - 打开方式必须同时指定“写出”和“二进制”,并用按位或组合:
ios::out | ios::binary。既可以先构造流对象再调用open,也可以在构造ofstream时一次性传入路径和打开方式,两种写法都可以。 Person里姓名必须用长度为 \(64\) 的字符数组(不要把string对象整块写入,底层文件接口按 C 风格字节处理更稳妥),另有一个int年龄。- 写入时调用
write:第一个参数是记录首地址,需要转换成const char*(对Person对象取地址得到的是Person*,与函数原型不符,必须强转);第二个参数是要写的字节数,使用sizeof(Person)。 - 写完后必须
close关闭文件。只写不读时屏幕上不会自动出现内容,数据已经在磁盘上。 - 再按二进制方式打开同一文件,读回全部记录,按询问输出。评测只检查读回后的姓名和年龄。
输入格式
第一行一个整数 \(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
- 通过率
- ?
- 上传者