我正在尝试创建随机访问文件。首先,我创建了一个文件" 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();
}
感谢您的帮助。
答案 0 :(得分:2)
给你的一些注意事项:
&#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
对象原样写入文件,或者编写没有标记字符或长度的文本。