我有一个包含2个整数的结构,我想将它们存储在二进制文件中并再次读取。
这是我的代码:
static const char *ADMIN_FILE = "admin.bin";
struct pw {
int a;
int b;
};
void main(){
pw* p = new pw();
pw* q = new pw();
std::ofstream fout(ADMIN_FILE, ios_base::out | ios_base::binary | ios_base::trunc);
std::ifstream fin(ADMIN_FILE, ios_base::in | ios_base::binary);
p->a=123;
p->b=321;
fout.write((const char*)p, sizeof(pw));
fin.read((char*)q, sizeof(pw));
fin.close();
cout << q->a << endl;
}
我得到的输出是0
。谁能告诉我这是什么问题?
答案 0 :(得分:5)
您可能希望在阅读之前刷新fout
。
要刷新流,请执行以下操作:
fout.flush();
原因是fstream通常希望尽可能长时间地缓冲输出以降低成本。要强制清空缓冲区,请在流上调用flush。
答案 1 :(得分:3)
将整数存储到文件时,您可以使用htonl()
,ntohl()
系列函数来确保以正确的格式回读它们,无论文件是否写得很大-endian机器,稍后在小端机器上回读。这些功能仅供网络使用,但在写入文件时可能很有用。
答案 2 :(得分:0)
fin.write((char*)q, sizeof(pw));
应该是
fin.read((char*)q, sizeof(pw));
答案 3 :(得分:0)
请注意,您的方法会假设整数的大小和字节顺序以及结构的包装,如果您的代码被移植到另一台机器,那么这些都不一定是真的。
出于可移植性的原因,您希望输出例程分别输出结构字段,并输出具有特定字节序的特定位宽的数字。这就是为什么有序列化包。
答案 4 :(得分:0)
试试这个:
fout.write((const char*)&p, sizeof(pw));
fin.read((char*)&q, sizeof(pw));
而不是
fout.write((const char*)p, sizeof(pw));
fin.read((char*)q, sizeof(pw));
vagothcpp(yournotsosmartc ++ programmer = p)