C++ 写入随机访问文件
C++ Writing in random access file
我正在尝试创建一个随机访问文件。首先,我创建一个文件"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
对象按原样写入文件,或者编写没有前哨字符或长度的文本。
- C ++程序编译错误,找不到/访问文件
- 从文件读取,并循环访问文件以写入数组
- 确实可以提高directory_iterator在Windows上按字母顺序访问文件和文件夹
- 如何在 bash 中使用管道在 c++ 中使用 getenv() 访问文件?
- 循环访问文件的每一行
- 无法从另一个函数访问文件范围变量的内容
- 如何访问文件的二进制数据?
- 如何从NTFS中的$ MFT文件访问文件的每个块的文件指针
- C++ 写入随机访问文件
- 无法从.cpp访问 .h 文件中的私有成员变量
- boost :: filesystem :: verver()无法访问文件,因为另一个过程正在使用该文件
- 如何在 Qt/C++ 中仅将文件路径作为字符串访问文件
- 如何从 JAVA 程序中访问文件中定义的类.DLL方法
- 如何访问 C 文件中C++公共布尔类成员(进行验证)
- 随机访问文件格式,用于分层组织的二进制文件和文本文件
- 连接到 FTP 服务器并访问文件
- 频繁访问文件映射内存
- 'Good'通过条目维护/更新/访问文件的编程形式
- 访问文件中的单个字符效率低下?(C++)
- wxwidgets类访问文件属性