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强制转换时尽量用二进制读写,避免不必要的错误



猜你喜欢

转载自blog.csdn.net/weixin_41265887/article/details/80967233