gpt4 book ai didi

C++按字段读取结构并将结构直接写入流

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:41 25 4
gpt4 key购买 nike

我在 visual studio 2008 中使用 C++。假设我有这样的结构:

    struct StructOfInts
{
int a;
int b;
int c;
};

这意味着要像这样读取和写入:

    void Read( std::istream& is, StructOfInts& myStruct  )
{
is.read( (char*)&myStruct.a, sizeof myStruct.a );
is.read( (char*)&myStruct.b, sizeof myStruct.b );
is.read( (char*)&myStruct.c, sizeof myStruct.c );
}
void Write( std::ostream& os, StructOfInts& myStuct )
{
os.write( (char*)&myStruct, sizeof myStruct );
}

当读取或写入文件时,上面的代码会导致某种内存损坏吗?通过内存损坏,我的意思是读入了不正确的值。我正在尝试确定正在读入的 -1.#QNB 值的来源,并且想知道这是否是原因。另外,如果我使用 pragma pack 打包结构有什么不同吗?

最佳答案

是的,由于 struct 字段之间可能存在填充,您的代码可能导致读取无效值。让我们使用您的 struct StructOfInts 示例,并想象编译器在字段之间插入一些填充,如下所示:

byte  | 0 1 2 3 | 4 5     | 6 7 8 9 | 10 11 12 13
value | field a | padding | field b | field c

然后当你将结构写入流时,你可能会得到类似的东西

byte | 0  1  2  3   | 4   5   | 6  7  8  9   | 10 11 12 13
char | \0 \0 \0 'a' | '?' '?' | \0 \0 \0 'b' | \0 \0 \0 'c'

如果字段(分别)包含值 (int)'a', (int)'b', (int)'c'

然后当你读回这些值时,它看起来像

myStruct->a = int version of \0 \0 \0 'a'
myStruct->b = int version of '?' '?' \0 \0
myStruct->c = int version of \0 'b' \0 \0

这显然不是你想要的。

在搜索了关于 #pragma pack 之后,它看起来对这个案例有帮助。编译器不会插入填充(尽管它实现定义的...),因此值(很可能)会被正确读取和写入。

另外,还有一件事:如果您在一个系统(计算机/操作系统/编译器)上进行写入,然后在另一个系统中读取数据,那么字节顺序问题也可能会导致问题。

关于C++按字段读取结构并将结构直接写入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454201/

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