我编写了一个程序,它必须将struct写入二进制文件并从中读取。 我使用fread,fwrite,fopen,fseek和fclose。 我编写了以下函数来打印我文件中的所有记录。
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();
}
注意:我首先运行并输入数据,我可以看到我的数据来自上面的func非常好并且页面到页面。但是当我退出程序时,一切都坏了。当我跑第二时间,并运行上面的功能,我得到分段错误,我跟踪它,bookPtrObj它是我的struct的指针,无法读取我的文件。我尝试使用fopen类型,[rb。 wb,ab +,rb +,a +,w +,aw +]等等。但我没有得到结果。 我用以下几行写入文件,当然我填充struct的元素然后运行以下两行:
fseek(bookFilePtr,0L,SEEK_END);
fwrite(ptr,sizeof(struct book),1,bookFilePtr);
如何将数据存档?
答案 0 :(得分:2)
你没有提供很多代码,但我的猜测是你保存指向字符串的指针,而不是字符串本身,甚至更糟(或者更糟糕的是?) - std::string
对象内容。你需要正确地序列化它们。
答案 1 :(得分:0)
在尝试将数据写入文件或从文件读取数据之前,应该写出文件中数据格式的规范。你正在做的是将未知格式的任意字节数据写入文件。如果这确实有效,那只能靠运气。
如果要在文件中存储整数,则需要确定是使用固定长度还是可变长度。如果变量,读者将如何确定它占用多少字节?最高位数/位是第一位还是最不重要位?你会用文字或二进制文写出来吗?
然后,您需要编写代码将数据转换为文件应具有的字节数。当你读回它们时,你需要将它们转换成你的程序想要用来操作它们的类型。
如果您没有经验,那么文本行可能是最好的。这样,您也可以在查看器或编辑器中轻松查看文件以理解它。
你不能这样做:
fwrite(ptr,sizeof(struct book),1,bookFilePtr);
你只是在文件中写入任意字节。是的,它们在您当前的执行上下文中是有意义的,但它们在另一个执行上下文中可能有意义也可能没有意义。您需要将它们转换为适合写入文件的定义明确的自包含数据格式。
这是一个愚蠢的例子:
const char *foo="foo";
fwrite(&foo, sizeof(&foo), 1, filePtr);
这将写出foo
的内容,它是指向值为"foo"
的字符串的指针。但是当你读回来时,你会回读一个指向一个甚至不再存在的地址空间的指针。你有什么意义吗?它不太可能指向您的地址空间中有意义的任何内容。