将用户定义的类型强制转换为 char* 时会发生什么?
What is happening when a user-defined type is cast to a char*?
我遇到了一堂课,我们使用了一个名为 "Person" 的用户定义类型,该类型将人的姓名存储在字符数组中,并将年龄存储为整数。该课程是关于编写和读取二进制文件的。主程序如下所示:
int main()
{
Person anil("anil",24); //initialize with name and age
fstream file("person.bin", ios::binary | ios::in | ios::out | ios::trunc);
if (!file.is_open())
cout << "Error while opening file.";
else
{
file.write((char*)&anil, sizeof(Person));
file.seekg(0); // go back to beginning
Person anjali; //declare new person object
//first argument is memory block, second argument is byte size
file.read((char*)&anjali, sizeof(Person));
anil.whoAreYou(); //outputs the name and age
anjali.whoAreYou();
}
return 0;
}
我不明白这些行是怎么回事:
file.write((char*)&anil, sizeof(Person));
file.read((char*)&anjali, sizeof(Person));
我理解 fstream 的写入和读取函数需要 memory_block 作为第一个参数...有人可以解释当对用户定义类型的引用被转换为 char * 时到底发生了什么吗? ?
在C/C++中,char *
经常被用作通用数据类型,因为它总是指向1个字节。您代码中的转换代码 (char*)&anil
使用 &
获取指向 anil
的指针,并将其转换为指向 char
的指针。它将 char
的序列写入文件,然后将其读回 anjali
.
的内存中
这会进行精确的内存复制,如果您有指向该内存中其他地方的指针,这会导致问题,因为在加载对象时该指针几乎永远不会有效。这可能只是一个例子,但现实世界的序列化非常棘手,通常最好留给某种序列化库。手动序列化是可能的,但只能在图书馆或类似的地方非常小心地完成。
如果您希望进行这种手工序列化,您需要确定序列化的格式并将基值写入文件。您还需要确定您是否真的需要二进制序列化,或者基于文本的序列化是否更适合。在大多数情况下,将对象写入 JSON 这样的文件格式会更容易一些,并且还具有在语言之间可移植和人类可读的优点。
std::fstream
派生自 std::istream
,它基本上是 basic_istream<T>
和 char as T
.
的类型定义
因此,fstream::read
需要一个字符指针作为第一个参数,并且转换将 anil
的起始地址转换为 char*
。因为 sizeof(char) == 1
在大多数情况下系统这是必不可少的,将 Person 实例的内容逐字节复制到提供的地址。
这在长 运行 中既不可移植也不可维护,特别是如果您在 类 中将指针作为成员变量,因为您实际上将序列化变量的原始内存地址。
我遇到了一堂课,我们使用了一个名为 "Person" 的用户定义类型,该类型将人的姓名存储在字符数组中,并将年龄存储为整数。该课程是关于编写和读取二进制文件的。主程序如下所示:
int main()
{
Person anil("anil",24); //initialize with name and age
fstream file("person.bin", ios::binary | ios::in | ios::out | ios::trunc);
if (!file.is_open())
cout << "Error while opening file.";
else
{
file.write((char*)&anil, sizeof(Person));
file.seekg(0); // go back to beginning
Person anjali; //declare new person object
//first argument is memory block, second argument is byte size
file.read((char*)&anjali, sizeof(Person));
anil.whoAreYou(); //outputs the name and age
anjali.whoAreYou();
}
return 0;
}
我不明白这些行是怎么回事:
file.write((char*)&anil, sizeof(Person));
file.read((char*)&anjali, sizeof(Person));
我理解 fstream 的写入和读取函数需要 memory_block 作为第一个参数...有人可以解释当对用户定义类型的引用被转换为 char * 时到底发生了什么吗? ?
在C/C++中,char *
经常被用作通用数据类型,因为它总是指向1个字节。您代码中的转换代码 (char*)&anil
使用 &
获取指向 anil
的指针,并将其转换为指向 char
的指针。它将 char
的序列写入文件,然后将其读回 anjali
.
这会进行精确的内存复制,如果您有指向该内存中其他地方的指针,这会导致问题,因为在加载对象时该指针几乎永远不会有效。这可能只是一个例子,但现实世界的序列化非常棘手,通常最好留给某种序列化库。手动序列化是可能的,但只能在图书馆或类似的地方非常小心地完成。
如果您希望进行这种手工序列化,您需要确定序列化的格式并将基值写入文件。您还需要确定您是否真的需要二进制序列化,或者基于文本的序列化是否更适合。在大多数情况下,将对象写入 JSON 这样的文件格式会更容易一些,并且还具有在语言之间可移植和人类可读的优点。
std::fstream
派生自 std::istream
,它基本上是 basic_istream<T>
和 char as T
.
因此,fstream::read
需要一个字符指针作为第一个参数,并且转换将 anil
的起始地址转换为 char*
。因为 sizeof(char) == 1
在大多数情况下系统这是必不可少的,将 Person 实例的内容逐字节复制到提供的地址。
这在长 运行 中既不可移植也不可维护,特别是如果您在 类 中将指针作为成员变量,因为您实际上将序列化变量的原始内存地址。