gpt4 book ai didi

c++ - 从C++中的二进制文件中删除结构

转载 作者:行者123 更新时间:2023-11-30 01:51:25 26 4
gpt4 key购买 nike

我目前正在尝试实现一个删除已保存在二进制文件中的特定结构的函数。我对如何去做有点困惑。我有一个可行但不是特别优雅的解决方案:我可以将整个结构文件读取到结构 vector ,删除旧文件,删除我想从 vector 中删除的结构,然后保存结构 vector 再次作为文件。我非常有信心这会奏效,但如果文件很大,这似乎是一个冗长且可能不必要的解决方案。我知道如何找到我想删除的结构,我知道如何更改其中的值(通过覆盖它),但我究竟该如何删除它?

这是我保存结构的方式:

std::fstream binary_file(fileLocation.c_str(), std::ios::out | std::ios::binary | std::ios::app);
binary_file.write(reinterpret_cast<char *>(&myStruct), sizeof(myStruct));
binary_file.close();

每个结构都有一个整数及其唯一 ID,我用它来找到合适的结构,如下所示:

myStream.open(fileLocation.c_str(), std::ios::in | std::ios::out | std::ios::binary);
while (!myStream.eof())
{
myStream.read(reinterpret_cast<char*>(&myStruct), sizeof(myStruct));
if (myStruct.ID == given_ID)
{
temp_fstream.seekg(-(sizeof(myStruct), std::ios::cur);
//delete struct
return;
}
}

我在这里不知所措,这有可能吗?我一直在考虑将结构标记为无效的想法,这样即使我的程序会读取它也不会将其用于任何事情,但同样,这似乎是个糟糕的主意。

有什么建议吗?

最佳答案

您可以在没有删除的项目的情况下重新创建文件,但是那是非常低效的。

这里需要的是更复杂的东西。例如,您可以想出一个标记结构已删除的系统。您的代码需要在该位置写入一些特殊值,以便它知道它已被删除,然后在保存另一个结构时重用该槽。

这会增加代码的复杂性。您将无法在单个语句中简单地读取和写入结构集合。

这种方法有很多变体。所需的确切代码取决于您的应用程序。

关于c++ - 从C++中的二进制文件中删除结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26146764/

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