fstream创建文件及写二进制文件

创建形式

1.fstream io("data.bin",ios::out)
2.fstream io;
io.open("data.bin",ios::out||ios::binary);

创建失败。。。

fstream io("data.bin",fstream::out);

创建成功。。。

但是------------------------

并没有保证io是二进制读写的;

fstream io("data.bin",fstream::out||ios::binary);
//或者fstream::binary

创建还是失败。。。

------------待更--------------

二进制读写形式

	io.close();
	io.open("data.bin");
	check(io);
	io.read(reinterpret_cast<char *>(&n), sizeof(int));
	while (!io.eof()) {
		cout << n << ' ';
		io.read(reinterpret_cast<char *>(&n), sizeof(int));
	}
	io.close();

reinterpret_cast:强制类型转换符

reinterpret_cast<type-id> (expression):
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。
作用:可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。

先写io.read(reinterpret_cast<char *>(&n),sizeof(int))是为了是文件指针指向当前的位置,

	io.close();
	io.open("data.bin");
	check(io);
	while (!io.eof()) {
            io.read(reinterpret_cast<char *>(&n), sizeof(int));
	    cout << n << ' ';
        }
	io.close();

如果想上面这么写会使得最后的一个数据被读了两次,即先读文件指针位置在写数据,导致最后数据被读了两次,切记!

PS:

为什么一定要保证文件是以二进制读写呢?

因为如果是文本文件以二进制文件读的时候,因为格式不同导致reinterpret_cast<char *>(&n)解释时出现了BUG,会致使某些数据解释之后跟io.eof()的结束标志冲突,导致文件读操作提前结束。例如26在文本文件写操作时,通过reinterpret_cast<char *>(&n)解释为00 1A 00 00,而用二进制文件写操作会解释为1A 00 00 00,查ASCII表可知:26代表^Z,所以读操作读文本文件时导致文件结束。所以使用reinterpret_cast强制转换时尽量用二进制读写,避免不必要的错误



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值