打开并同步磁盘
fopen and sync with disk
我编写了一个程序,它必须将结构体写入二进制文件并从中读取。我使用读、写、开、寻和闭。我编写了下面的函数,打印文件中的所有记录。
void ReadFile::printList(){
// clearerr(bookFilePtr);
fseek(bookFilePtr,0L,SEEK_SET); // set to begin of file
int counter = 1;
long int line = 1;
int pageCounter = 1;
while (this->readFromFile() == 1){
string output;
mvprintw(++line, 27,"***Title*****************Value*********" );
output = "Name: " + bookPtrObj->name;
mvprintw(++line, 27, output.data());
output = "Publisher: " + bookPtrObj->publisher;
mvprintw(++line, 27,output.data());
output = "Author: " + bookPtrObj->author;
mvprintw(++line, 27,output.data());
output = "Translator: " + bookPtrObj->translator;
if (bookPtrObj->translation == true )
mvprintw(++line, 27,output.data());
if (bookPtrObj->stock != true )
mvprintw(++line, 27,"Stock: The given book doesn't exist.");
else
mvprintw(++line, 27,"Stock: The given book exist.");
if ( pageCounter % 3 == 0){
mvprintw(++line, 27,"Press any key to see next page...");
getch();
clear();
line = 1;
}
pageCounter++;
refresh();
fseek(bookFilePtr, counter * sizeof(struct book) ,SEEK_SET); // seek to next data
counter ++;
}
// fflush(bookFilePtr);
menu();
}
注意:我运行的第一个和数据输入,我可以看到我的数据从上面的函数非常好,页到页。但是当我退出程序时,一切都坏了。当我第二次运行时,运行上面的函数,我得到分段故障,我跟踪它,bookPtrObj,它是我的结构体的指针,不能读取我的文件。我尝试用fopen类型,[b]。Wb, ab+, rb+,a +, w+,aw+]等等。但是我没有得到结果。我用以下行写入文件,当然,我填充结构体的元素,然后运行以下2行:
fseek(bookFilePtr,0L,SEEK_END);
fwrite(ptr,sizeof(struct book),1,bookFilePtr);
如何保持我的数据在文件中?
您没有提供大量的代码,但我猜您保存了指向字符串的指针,而不是字符串本身,或者更糟(或者更糟?)- std::string
对象内容。您需要正确地序列化它们。
在尝试将数据写入文件或从文件中读取数据之前,应该为文件中的数据将具有的格式编写规范。您所做的是以未知格式将任意字节的数据写入文件。如果真的成功了,那只是运气。
如果你想在文件中存储一个整数,你需要决定是使用定长还是变长。如果是变量,读取器如何确定它占用了多少字节?最高位/位在前还是最低位在前?你是用文本还是二进制来写?
然后需要编写代码将数据转换为文件应有的字节数。当你把它们读回来的时候,你需要把它们转换成你的程序想要用来操作它们的类型。
如果你没有经验,几行文字可能是最好的。这样,您还可以轻松地在查看器或编辑器中查看该文件以理解它。
你不能这样做:
fwrite(ptr,sizeof(struct book),1,bookFilePtr);
你只是在向文件中写入任意字节。是的,它们在当前的执行上下文中是有意义的,但它们在另一个执行上下文中可能有意义,也可能没有意义。您需要将它们转换为适合写入文件的定义良好的、自包含的数据格式。
这里有一个愚蠢的例子:
const char *foo="foo";
fwrite(&foo, sizeof(&foo), 1, filePtr);
这将写出foo
的内容,这是一个指向值为"foo"
的字符串的指针。但是当你回读的时候,你回读的是一个指针,指向一个已经不存在的地址空间。你能理解这是什么意思?它不太可能指向地址空间中任何有意义的东西。
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- Windows 进程间同步类似事件?
- 矢量和其他容器如何在磁盘上工作?
- 如何从整个磁盘中排除要装载的一个文件
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- 如何将 IPropertyBag 保存到磁盘
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 防止临时对象文件访问 MSVC 中的磁盘
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 打开并同步磁盘