gpt4 book ai didi

c++ - c++ 中的 read() 函数类似于 c read()

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:07 26 4
gpt4 key购买 nike

在c++中有没有等价于c read()的方法?为了说明我的问题,在 C 中,如果我有:

struct A{  
char data[4];
int num;
};

...如果我使用:

A* a = malloc (sizeof(struct A));  
read (fd, a, sizeof(struct A));

我可以直接填充我的结构。 c++ 中有没有一种方法可以在不使用 c read() 方法的情况下实现这一点? std::istream中的方法需要char*作为参数,有没有以void*作为参数的方法?

最佳答案

最接近的等价物几乎肯定是使用 istream::read:

struct A {
char data[4];
int num;
};

A a;

std::ifstream in("somefile", std::ios::binary);

in.read((char *)&a, sizeof(a));

请注意,这在许多方面等同于 read,您可能不喜欢它——例如,如果您升级编译器,它可能会中断,并且可能会中断只是呼吸有点不对。

如果你无论如何都坚持这样做,你可能至少想隐藏一点丑陋:

struct A { 
char data[4];
int num;

friend std::istream &operator>>(std::istream &is, A &a) {
return is.read((char *)a, sizeof(a));
}
};

然后其他代码将使用普通插入运算符从文件中读取一个实例:

std::ofstream in("whatever", std::ios:;binary);

A a;

in >> a;

这样,当您清醒过来并更理智地序列化您的对象时,您只需要修改 operator>>,其余代码将保持不变。

friend std::istream &operator>>(std::istream &is, A &a) { 
// At least deals with some of the padding problems, but not endianess, etc.
os.read(&a.data, sizeof(a.data));
return os.read((char *)&a.num, sizeof(a.num));
}

然后使用它的其余代码不需要更改:

A a;
in >> a; // remains valid

关于c++ - c++ 中的 read() 函数类似于 c read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21359942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com