C ++在随机访问文件中编写

时间:2017-06-20 14:08:07

标签: c++ file fstream

我正在尝试创建随机访问文件。首先,我创建了一个文件" book_data.txt"并且写了大约10000个空白BookType,然后我想通过ID来解析一些BookType并存储到文件,但是这个代码可能会覆盖旧文件中的所有数据,并且每次调用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();
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

给你的一些注意事项:

不要将二进制数据放入&#34; * .txt&#34;文件。

&#34; .txt&#34;的通用文件类型是一个没有控制字符的ASCII文本文件(通常的行尾,制表符,退格键和其他一些除外)。

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

不想写类或结构的镜像

只有带有POD成员的struct应该按原样编写

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

某些对象(例如std::string)可能将其数据放在其他位置,因此您只能编写&#34;控件&#34;数据,而不是文本。

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

序列化

在互联网上搜索&#34; C ++序列化&#34;。您想要做的是称为序列化。 Boost有一个库。

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

不希望使用二进制格式。

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

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

二进制格式是特定于平台的,可能不容易移植,请参阅&#34; Big Endian&#34;和&#34; Little Endian&#34;。

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

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

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

失败与上述

有关

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

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