我编写了一个程序,它必须将结构体写入二进制文件并从中读取。我使用读、写、开、寻和闭。我编写了下面的函数,打印文件中的所有记录。
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"
的字符串的指针。但是当你回读的时候,你回读的是一个指针,指向一个已经不存在的地址空间。你能理解这是什么意思?它不太可能指向地址空间中任何有意义的东西。