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

时间:2016-05-10 22:43:47

标签: c++ pointers binaryfiles typecasting-operator

今天在CS 111课程中,我的导师以“'简介”结束了。看看将结构写入二进制文件。我说简短,因为他只是把它作为一种旁边,说它不会在决赛中。问题是,我不完全理解程序示例中发生了什么,这让我感到烦恼。希望有人会花时间向我解释。代码如下:

#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的指针正在被声明和初始化,但究竟是什么被初始化,以及如何在下一行中使用它? 我希望这不是一个愚蠢的问题。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

在此行之后

char *raw_data = (char*)&info;,raw_data将指向info的第一个字节的地址。

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

本质上,我们找到PayStub的起始地址和长度,并将其写入磁盘。

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

答案 1 :(得分:0)

想象一下struct(在简单的C中)只是将一堆object与#34;字符串&#34;绑定在一起的方式。

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

在您的示例代码中,&info返回指向内存中对象开头的指针,(char*)&info只是将其解释为指向字符的指针,因此可以将其视为一个序列二进制数据。 sizeof返回结构占用的内存量(以字节为单位),然后使用此信息将结构直接写入内存中的文件。

请记住,此类数据存储绝对可移植。它可能从32位计算机变为64位计算机!