【问题标题】:C++ Writing in random access file [closed]C ++写入随机访问文件[关闭]
【发布时间】:2017-06-20 14:08:07
【问题描述】:

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

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();
}

感谢您的帮助。

【问题讨论】:

  • 我试过了,但是没有效果
  • 我认为问题出在您打开文件的方式上检查this 它可能会有所帮助...尝试更改为:std::ofstream bookFout("book_data.txt",std::ios::app | std::ios::binary);
  • 顺便说一句,在输出流上查找文件末尾是未定义的行为。某些平台可能会填充,其他平台可能会引发异常或使您的硬盘崩溃。
  • 显示BookType的定义

标签: c++ file fstream


【解决方案1】:

给你的一些注意事项:

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

“.txt”的常见文件类型是不带控制字符的 ASCII 文本文件(除了通常的行尾、制表符、退格符和其他一些字符)。

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

最好不要写类或结构的镜像

只有具有 POD 成员的 structs 应按原样写入。

类可能有 v-tables 和成员之间的填充。

某些对象,例如std::string,可能会将它们的数据放在其他地方,因此您只需要编写“控制”数据,而不是文本。

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

序列化

在互联网上搜索“C++ 序列化”。您要做的就是序列化。 Boost 有一个库。

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

最好不要使用二进制格式。

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

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

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

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

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

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

失败与上述有关

您的代码 sn-p 可能因上述原因之一失败。

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

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 2018-04-05
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2012-06-16
    • 2016-09-06
    相关资源
    最近更新 更多