我的代码就像这样:
已更新:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char **argv)
{
ifstream r("foo.bin", ios::binary);
ofstream w("foo.bin", ios::binary);
int i;
int ints[10] = {0,1,2,3,4,5,6,8,9};
w.write((char*)&ints, sizeof(ints));
int in_ints[10];
r.read((char*)&in_ints, sizeof(in_ints));
for(i = 0;i < 10;i++) {
cout << in_ints[i] << " ";
}
cout << endl;
return 0;
}
现在,写入部分似乎成功,例如运行32位长的od命令(我的系统是32位)将显示正确的序列,包括十六进制转储。
然而,读取时,我得到的随机序列和负整数不应该发生(它被拆分,并且大多数为零,因为我的整数很小,符号位不应该打开。)
你知道为什么我的read方法无法工作,当它与我的写方法完全相反时?
答案 0 :(得分:7)
在w.flush()
之前尝试w.close()
或r.read
。问题是当你写它时通常是bufferes文本而不是将它保存在文件中。所以r.read
文件中没有任何内容。
答案 1 :(得分:6)
此代码:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
{
ofstream w( "foo.txt" );
int ints[10] = {0,1,2,3,4,5,6,8,9};
w.write((char*)&ints, sizeof(ints));
}
{
ifstream r( "foo.txt" );
int in_ints[10];
r.read((char*)&in_ints, sizeof(in_ints));
for( int i = 0; i < 10; i++) {
cout << in_ints[i] << " ";
}
}
}
打印:
0 1 2 3 4 5 6 8 9 0
请注意,初始化中缺少一些数字。
答案 2 :(得分:1)
写入文件的数据不一定对其他流可见(in
文件关闭或至少刷新之前的相同过程。
如果在启动程序之前文件"foo.bin"
不存在,
打开它进行阅读将失败(所以进一步使用将是一个
无操作)。您的程序违反了最基本的规则之一
编程:如果有任何事情可能失败,请始终检查它是否有过
持续。您不会检查IO的任何结果。
我可能还会补充说,以这种方式读取和写入数据非常非常
脆弱的,一般只能保证在同一个工作
进程 - 甚至使用不同版本的编译器重新编译
或者不同的编译器选项可能导致数据表示
改变,结果是你将无法读取所写的数据
早。在int
数组的情况下,当然,这是非常高的
只要你不改变机器架构就不太可能。但在
一般来说,如果您将来需要重读数据,那就是了
技术最好避免。 ((char*)
是reinterpret_cast
,而且是reinterpret_cast
我们知道,{{1}}是一个非常强烈的信号,有一个
可移植性问题。)