C++ 写入随机访问文件

C++ Writing in random access file

本文关键字:访问 文件 随机 C++      更新时间:2023-10-16

我正在尝试创建一个随机访问文件。首先,我创建一个文件"book_data.txt"并写入大约 10000 个空白 BookType,然后我想清除一些 BookType 并按 ID 存储到文件,但这段代码可能会覆盖旧文件中的所有数据,并且每次调用 saveData() 时只在文件中存储 1 个对象。请为此给出解决方案。

void BookType::saveData()
{
std::ofstream bookFout("book_data.txt",std::ios::out | std::ios::binary);
bookFout.seekp((getBookID() - 1) * sizeof(BookType));
bookFout.write(reinterpret_cast<char*>(this), sizeof(BookType));
bookFout.close();
}

感谢您的任何帮助。

给你一些注意事项:

不要将二进制数据放入"*.txt"文件中。

".txt"的常见文件类型是没有控制字符的 ASCII 文本文件(通常的行尾、制表符、退格键和其他一些除外)。

不可打印的字符可能会弄乱文本编辑器。

不喜欢编写类或结构的镜像

只有具有 POD 成员的struct才应按原样编写。

类在成员之间可能有向量表和填充。

某些对象(如std::string)的数据可能位于其他位置,因此您只会写入"控件"数据,而不是文本。

指针不可移植。 您的操作系统可能会在不同的执行中将程序重新定位到不同的地址(并且内存会有所不同)。 此外,不同的平台可能具有不同的指针格式。

序列化

在互联网上搜索"C++序列化"。 您要执行的操作称为序列化。 Boost有一个库。

如果不想使用库,请使用类中的方法将单个成员写入缓冲区或流并从中读取。 这可以是递归的(复合对象可以调用对象成员函数进行序列化)。

不希望使用二进制格式。

最后,不希望使用二进制格式。

二进制格式很难在编辑器中读取。

二进制格式是特定于平台的,可能不容易移植,请参阅"大端序"和"小端序"。

ASCII文本是可移植的,并且易于阅读(这在开发过程中是一件好事)。

您的数据有人类可读的格式,例如 XML。

通常的瓶颈不是读取数据文件,因为在大多数应用程序中读取数据文件是不常见的操作。

故障与上述有关

您的代码片段可能不符合上面列出的原因之一。

例如,将std::string对象按原样写入文件,或者编写没有前哨字符或长度的文本。