`fout.write( reinterpret_cast<const char*>(&e), sizeof(e) );` 为什么这里转换为 `const char*`?

`fout.write( reinterpret_cast<const char*>(&e), sizeof(e) );` why here casting into `const char*`?

代码

#include <iostream>
#include <fstream>

struct emp
        {
            char name[20];
            int age;
        };

int main()
{
    emp e1={"Abhishek", 22},e2;
    
    std::ofstream fout;
    fout.open("vicky.dat", std::ios::out | std::ios::binary);
    fout.write(reinterpret_cast<const char*>(&e1),24);
    fout.close();

    std::ifstream fin;
    fin.open("vicky.dat", std::ios::in | std::ios::binary);
    fin.read(reinterpret_cast<char*>(&e2),24);
    fin.close();

    std::cout<<e2.name<<" "<<e2.age<<"\n";

    return 0;
}

为什么需要使用 writeread 函数的第一个参数执行 reinterpret_cast

为什么我们在 writeread 函数中分别将类型 emp 的地址转换为 const char*char*

Why it is necessary to do reinterpret_cast with 1st argument of write and read function ?

因为 write() 的第一个参数是 const char*read() 的第一个参数是 char*.

why we casting address of type emp particularly to const char* and char* in write and read function respectively ?

在你的情况下,你可以将两者都转换为 char* - 但是,在 write 的情况下,它不需要可变对象,因为它不会以任何方式修改它,如果您尝试转换为 char*.

,您将无法 write 一个 const 对象

作品:

const emp e1 = {"Abhishek", 22};
fout.write(reinterpret_cast<const char*>(&e1), sizeof e1);

emp e2 = {"Foo", 23};
fout.write(reinterpret_cast<char*>(&e2), sizeof e2);
fout.write(reinterpret_cast<const char*>(&e2), sizeof e2);

甚至不编译:

const emp e1 = {"Abhishek", 22};
fout.write(reinterpret_cast<char*>(&e1), sizeof e1);

与问题无关但值得一提: 您已将 emp 的大小硬编码为 24。不。使用 sizeof 获取实际大小。即使 int 在您当前的平台上是 4 个字节,如果您在不同的平台上编译它也可能不是。

与上述相关:如果您希望文件格式在不同平台上工作并处理 endianness,请使用固定宽度类型(如 uint32_t 用于 4 字节无符号整数) - 但是仍然使用 sizeof,因为当您 add/remove 成员时手动计算尺寸很容易导致错误。