打开并同步磁盘



我编写了一个程序,它必须将结构体写入二进制文件并从中读取。我使用读、写、开、寻和闭。我编写了下面的函数,打印文件中的所有记录。

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"的字符串的指针。但是当你回读的时候,你回读的是一个指针,指向一个已经不存在的地址空间。你能理解这是什么意思?它不太可能指向地址空间中任何有意义的东西。

最新更新