C ++如何将整数存储到二进制文件中?

时间:2010-03-24 14:38:07

标签: c++ file-io binary

我有一个包含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。谁能告诉我这是什么问题?

5 个答案:

答案 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)