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