Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++在随机存取文件中的写入_C++_File_Fstream - Fatal编程技术网

C++在随机存取文件中的写入

C++在随机存取文件中的写入,c++,file,fstream,C++,File,Fstream,我正在尝试创建一个随机访问文件。首先,我创建了一个文件book_data.txt,写了大约10000个空白BookType,然后我想通过ID清除一些BookType并存储到文件中,但这段代码可能会覆盖旧文件中的所有数据,每次调用saveData时只在文件中存储一个对象。请给出一个解决方案 void BookType::saveData() { std::ofstream bookFout("book_data.txt",std::ios::out | std::ios::binary);

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

给你一些提示:

不要将二进制数据放入*.txt文件中。 txt的常见文件类型是一个ASCII文本文件,除了通常的行尾、制表符、退格和其他一些字符外,没有控制字符

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

不喜欢编写类或结构的镜像 只有具有POD成员的结构才应按原样编写

类在成员之间可以有v形表和填充

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

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

系列化 < Internet >搜索C++序列化。您要做的就是所谓的序列化。Boost为此提供了一个库

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

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

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

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

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

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

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

失败与上述因素有关 您的代码段可能无法满足上面列出的原因之一


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

这是否相关?我试过了,但是没有效果。我相信问题在于你打开文件的方式。检查可能会有帮助。。。尝试更改为:std::ofstreambookfoutbook_data.txt,std::ios::app | std::ios::binary;顺便说一句,在输出流上查找超过文件结尾的内容是未定义的行为。某些平台可能会挂载,其他平台可能会引发异常或使硬盘崩溃。显示BookType的定义