C++ 将结构保存并加载到文件中

c++ save and load structures to file

提问人:BigAgg 提问时间:11/16/2022 更新时间:11/16/2022 访问量:378

问:

我目前正在处理一个游戏项目,我正在将一个包含游戏对象所有所需值的结构保存到一个文件中。保存是完全可以的,但是如果我开始加载它们,它只会加载其中的前 25 个。 之后,我尝试使用加载对象,直到最后一个对象没有得到正确的类型并脱离循环。这工作得很好,但可能不是最优雅的解决方案。while (true)level-data.file

using namespace std;
struct{
    const char* type;
    int sizeW;
    int sizeH;
    int collisionLayer;
    int textureID;
    int positionX;
    int positionY;
} loadStruct;

ifstream fileObj;
fileObj.open("level.txt");
if (fileObj.is_open()){
    while (!fileObj.eof()){
        fileObj.read((char*)&loadStruct, sizeof(loadStruct));
        // creating my object out of loadStruct -> working fine
    }
    fileObj.close();
}

我试图删除对 eof() 的检查,如果发现错误,只需在 while 循环中放置一个 try/catch 爆发,但这个想法并不是最优雅的,并且在 100% 的时间里都不起作用。

C++ 结构 体加载 ifstream eof

评论

1赞 Ted Lyngmo 11/16/2022
您正在保存和恢复不起作用的 =>。const char*
2赞 user4581301 11/16/2022
当你使用指针时,你实际上是在写地址,而不是所指向的数据。很有可能您需要序列化,而不仅仅是盲目的二进制转储。write
1赞 Jesper Juhl 11/16/2022
请记住,允许编译器在成员之间和结构末尾放置填充字节。而且你不知道它是否做到了这一点 - 你必须以一种不依赖填充的方式序列化和期望化你的数据。
2赞 Thomas Matthews 11/16/2022
编写 C 样式字符串的一种实用方法是先写长度,然后块写文本。读取时,读取数量,然后分配内存,然后阻止从文件读取到分配的内存中。
1赞 john 11/16/2022
@BigAgg 您无法在二进制模式下打开文件,但您正在执行二进制 I/O,这可能会解释您看到的结果。

答:

1赞 BigAgg 11/16/2022 #1

感谢您将我“指向”char* 类型......这是导致它失败的严重问题。现在我重新设计了它,也摆脱了 .eof(),只需检查我的类型是否被写入。

using namespace std;

struct {
    char type[20];
    int sizeW;
    int sizeH;
    int collisionLayer;
    int textureID;
    int positionX;
    int positionY;
} loadStruct;

bool reading = true;
ifstream fileObj;
fileObj.open(filename);
if (fileObj.is_open()){
    while (reading){
        string str = "empty";
        strcpy(loadStruct.type, "empty");
        fileObj.read((char*)&loadStruct, sizeof(loadStruct));
        if (loadStruct.type == str){
            reading = false;
            break;
        }
    }
}
fileObj.close();

评论

0赞 user4581301 11/16/2022
应该可以解决您在短期内遇到的大多数问题,但要小心! 更改不同平台上的大小。只有最小大小 16 位'是保证的。通常您会看到 32 位 int,有时会看到 64 位,但您需要小心文件是否会被不同的平台读取。您还必须注意字节序、字节顺序的变化。int