使用C++将整数写入二进制文件?

19

我有一个非常简单的问题,但对我来说却很难,因为这是我第一次尝试使用二进制文件,而且我不太理解它们。我想做的就是将一个整数写入二进制文件。

我这样做:

#include <fstream>
using namespace std;
int main () {
    int num=162;
    ofstream file ("file.bin", ios::binary);
    file.write ((char *)&num, sizeof(num));
    file.close (); 
    return 0;
}

请问我哪里做错了,能告诉我吗?

让我困扰的部分是带有file.write的那一行,我不理解它。

先感谢您的帮助。


1
它能工作吗?它与您的期望有何不同? - Kerrek SB
2
吹毛求疵的建议:1)使用reinterpret_cast<const char *>(&num),并省略file.close()return 0,因为所有这些都会自动发生。 - Kerrek SB
2
它将&num的类型转换为const char *,类似于您当前的转换,但这是一种更明确的编写意图的方式,而不是粗糙的C转换。这只是风格和技巧的问题,但在C++中,您应该习惯于精确地表达您想要的内容。 - Kerrek SB
您可能会发现十六进制编辑器对于检查文件很有用。这里有一个不错的免费版本:http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm - Steve Wellens
2
@KerrekSB:是的,是的。这就是你在不经思考的情况下打字时会发生的事情。为了辩护,你可以这样重新表述句子:“……,据我所知,只有一些编译器……”,而标记的短语是“据我所知”的同义词。 - Asaf
显示剩余4条评论
1个回答

37
让我困扰的部分是带有file.write的那一行,我不理解它。
如果您阅读ofstream.write()方法的文档,您会发现它需要两个参数:
1. 一个指向数据块的指针,其中包含要写入的内容; 2. 一个表示此块大小(以字节为单位)的整数值。
这个语句只是将这两个信息提供给ofstream.write()
file.write(reinterpret_cast<const char *>(&num), sizeof(num));

&num 是数据块的地址(在本例中仅为整数变量),sizeof(num) 是该块的大小(例如,在32位平台上为4个字节)。


3
重要提示:此处写入的数据是按照存储在内存中的方式进行的,因此生成的二进制文件在具有不同字节序的计算机上将无法读取。 - Mikolasan
@Mikolasan 我该如何让二进制文件在不同的机器上可读? - thatGuy
@thatGuy,你的代码应该检查正在运行的机器上使用哪种字节序(请参考此链接https://dev59.com/_XNA5IYBdhLWcg3wVcT6#38141476),如果与二进制文件格式不同,则在读取或写入数据之后进行[转换](https://dev59.com/0HVD5IYBdhLWcg3wDXF3),否则直接读/写并按原样使用。 - Mikolasan

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