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

4

我有一个包含两个整数的结构体,我希望将它们存储到二进制文件中并再次读取。

这是我的代码:

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。有人能告诉我问题出在哪里吗?

fin.write?应该是fin.read吧。这是真正的代码吗?在打开输入文件之前,您可能需要刷新/关闭输出流。 - CB Bailey
5个回答

5

在从 fout 读取之前,您可能需要刷新它。

要刷新流,请执行以下操作:

fout.flush();

这是因为fstream通常希望尽可能地缓冲输出以降低成本。要强制清空缓冲区,您可以在流上调用flush。

哇!我通过清空fout得到了它...非常感谢...我能知道为什么需要清空它吗? - blaxc
我在答案中添加了一些关于此的注释。基本上,fstreams是缓冲对象。在文件本身具有数据之前,您需要刷新该缓冲区。 - Bill Lynch

4

在将整数存储到文件时,您可以使用htonl()ntohl()函数系列来确保无论文件是在大端机器上写出并在小端机器上读回,都能以正确的格式读取。这些函数原本是为网络使用而设计的,但在写入文件时也非常有用。


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(你并不那么聪明的C++程序员=p)


0
fin.write((char*)q, sizeof(pw));  

可能应该是这样

fin.read((char*)q, sizeof(pw));  

我已经修改了它... 实际上我正在使用fin.read而不是fin.write... 那么,问题出在哪里?谢谢你的回复。 - blaxc

0

请注意,您的方法假设整数的大小和字节序以及结构体的打包方式,这些都不一定在将代码移植到另一台机器时成立。

出于可移植性的考虑,您需要编写输出例程,将结构体字段分别输出,并以特定的字节宽度和特定的字节序输出数字。这就是为什么有序列化包的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接