fopen并与磁盘同步

时间:2011-12-24 21:28:54

标签: c++ struct io fopen fwrite

我编写了一个程序,它必须将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);

如何将数据存档?

2 个答案:

答案 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"的字符串的指针。但是当你读回来时,你会回读一个指向一个甚至不再存在的地址空间的指针。你有什么意义吗?它不太可能指向您的地址空间中有意义的任何内容。