在 C++ 中写入二进制文件时键入转换指针

Type casting pointer when writing to binary file in C++

今天在 CS 111 class 我的讲师以 'brief' 将结构写入二进制文件作为结束。我说简短是因为他只是把它作为一种旁白,说它不会出现在决赛中。问题是,我不完全理解程序示例中发生了什么,这让我很困扰。希望有人会花时间向我解释一下。代码如下:

#include <iostream>
#include <fstream>
using namespace std;

struct PayStub
{
    int id_num;
    bool overtime;
    float hourly_rate;
};

int main()
{
    PayStub info = {1234, false, 15.45};

    ofstream data_store;

    data_store.open("test.cs111", ios::binary);

    char *raw_data = (char*)&info;
    data_store.write(raw_data, sizeof(PayStub));

    data_store.close();

    return 0;

}

我不明白声明 char *raw_data = (char*)&info; 中具体发生了什么以及为什么有必要这样做。我知道正在声明和初始化指向 char 的指针,但它究竟被初始化为什么,下一行如何使用它? 我希望这不是一个愚蠢的问题。预先感谢您的帮助。

char *raw_data = (char*)&info;这一行之后,raw_data会指向info的第一个字节的地址。

使用 data_store.write(raw_data, sizeof(PayStub)); 我们要求 data_store 将内存中从 raw_data 开始到 raw_data + sizeof(PayStub)) 结束的内容写入文件。

本质上就是找到PayStub的起始地址和长度,写入磁盘

这不是一个愚蠢的问题。一旦你阅读了指针,一切都会变得有意义。

想想 struct (in plain C) to simply be a way of binding a bunch of object 和 "string"。

一个int可以在内存中用4个字节表示。由两个 int 组成的结构将是 8 个字节,一个 int 紧挨着另一个

在您的示例代码中,&info returns 指向内存中对象开头的指针,而 (char*)&info 只是解释为指向字符的指针,因此它可以被视为二进制数据序列。 sizeof returns 结构需要多少内存(以字节为单位),然后使用此信息将结构直接从内存写入文件。

请记住,这种类型的数据存储绝对不可移植。它可能因 32 位计算机和 64 位计算机而异!