在 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 位计算机而异!
今天在 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 位计算机而异!