【问题标题】:File Handling with LinkList in C++在 C++ 中使用链表处理文件
【发布时间】:2012-11-01 15:30:01
【问题描述】:

问题:我正在尝试将双向链接列表的对象写入(二进制写入)到文件中并从中写入。 我必须编写对象的完整内容,然后从文件中加载它,并将其存储到新对象中,以按 FIFO 顺序重新创建列表。 我认为我写得正确,但我真的不知道如何从文件中加载(读取)它。

记住:我只是想保存和读取节点的CONTENTS,以及NOT POINTERS.

代码:

//template type BOOK class

template<class mytype>
class BOOK      
{
private:
    static int count;   //declaration of static variable to set ID for books
public:
    BOOK<mytype> *next, *prev;  //BOOK type pointers; 'next' to store address of 
next BOOK & 'prev' to store address of previous BOOK
    int ID;         //variable to store ID of a book
    string bookName;//string to store name of a book
    string author;  //string to store name of author of book
    string book_type;//string to store type of a book
    long copies;    //variable to store no. of copies a book
    long price;     //variable to store price of a book
    string status;  //to store status of a book, either its in stock or not
    dynamicQueue<string> book_queue;    //created an object of queueClass as data member of each Book

    BOOK()  //Constructor 0 argument to initialize everything
    {
        count++;    //increment counter
        ID=count;   //assign counter to ID to be ID of newly added book

        next = prev = 0;        //Initializing both pointers to 0

        bookName = "\0";
        author = "\0";
        book_type = "\0";
        copies = price = 0;
        status= "InStock";
    }

    BOOK(BOOK *n =  0, BOOK *p = 0, string book = "\0", string athr = "\0", string buk_type = "\0", long cp=0, long pr=0) //Constructor multiple arguments, to store information about a book
    {
        next = n;       //store contents of user-given value n into next
        prev = p;       //store contents of user-given value p into previous

        bookName = book;//store contents of user-given value book into bookName
        author = athr;  //store contents of user-given value athr into author
        book_type = buk_type;//store contents of user-given value buk_type into book_type
        copies = cp;    //store contents of user-given value cp into copies
        price = pr;     //store contents of user-given value pr into price
        status= "InStock";
        count++;        //increment counter
        ID=count;       //assign counter to ID to be ID of newly added book
    }
};

template <class mytype>    // declaration of
int BOOK<mytype>::count=0; // static variable to set ID for books
//--------------------

添加新书的主要部分。

BookStoreDataBase<char> obj;    //created object of Doubly linked list
string Book, Author, Booktype;
long Copies=1, Price=0;
cout<<"Enter Name of Book = ";  cin>>Book;
cout<<"Enter Author = ";        cin>>Author;
cout<<"Enter Type of Book = ";  cin>>Booktype;
cout<<"Enter Number of Copies = ";  cin>>Copies;
cout<<"Enter Price (PKR) = ";   cin>>Price;

obj.addBook(Book, Author, Booktype, Copies, Price);

保存功能将所有数据保存到文件

template <class mytype>
void DoublyLinkedList<mytype>::save_data()
{
    NODE<mytype> * temp = head; //made copy of head
    fstream file;     //created new file
    file.open("mydata.txt", ios::binary | ios::out | ios::app);

    while(temp->next!=0) //Until link list end
    {
          file.write(reinterpret_cast<char*>(&temp), sizeof(temp));
          temp = temp - > next; //move temp to next node
    }
    file.write(reinterpret_cast<char*>(&temp), sizeof(temp)); //write again for last  
                                                              //book's data
    file.close();
}

现在我几乎不知道如何从文件中读取列表,将内容存储到每个节点中并扰乱保存的排列,以 FIFO 顺序重新创建列表。所以我可以稍后打印。我已经练习了很多,去了论坛等,但没有找到任何具体的解决方案。请帮帮我。提前致谢


我的努力示例

template <class mytype>
void DoublyLinkedList<mytype>::load_data()
{
    fstream file;
    file.open("mydata.txt", ios::binary | ios::in);
    while(!file.eof())
    {
        NODE<mytype> *temp = new NODE<mytype>;
        file.read(reinterpret_cast<char*>(&temp), sizeof(temp));
        if(is_Empty())
        {
            head = tail = temp;
        }
        else
        {
            temp->prev->next = temp;
            temp->next=0;
        }
    }
    file.close();
}
//-------------------

没有编译时间错误。

运行时错误: DobulyList.exe 中 0x00CD8391 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000004。

【问题讨论】:

  • 我认为不可能二进制编写一个包含 std::strings 的类并将字符串数据包含在输出中。为什么 Book 是一个模板类?
  • Book 类就像一个 NODE 类或结构,与原始的 DoublyClass(DataBase 类)一起使用来管理单个节点/书。

标签: c++ file-io binaryfiles file-handling doubly-linked-list


【解决方案1】:

我认为你最好的办法是在 BOOK 类上有一个方法,它可以以预定义的方式序列化内容。

template<class mytype>
class BOOK      
{
private:
    //members
public:
    //more members

    ....

    bool read( istream& in );
    bool write( ostream& out );

    ....

};

因此,因为您想要二进制 - 您需要为 ID 写入和 int,然后为字符串写入大小、字节等...

然后您将其反转为读取。读取一个int并分配给ID,然后读取大小,读取大小字符并分配给字符串等......

例如

//fill in template stuff I'm lazy...
bool Book::read( istream& in )
{
     size_t stringSize; //you need to think about what types you read/write
     char buffer[SomeArbitrarySize];
     file.read( ID ,sizeof(int));
     file.read( stringSize ,sizeof(size_t));
     file.read( buffer, stringSize );
     mStringMember = buffer;
     ... etc ...
}

然后对于列表中的每个项目,您将读取/写入调用委托给节点。您可能还想先写入/读取节点数量的条目。

template <class mytype>
void DoublyLinkedList<mytype>::load_data()
{
    fstream file;
    file.open("mydata.txt", ios::binary | ios::in);
    while(!file.eof())
    {
        NODE<mytype> *temp = new NODE<mytype>;
        temp->read(file);
        if(is_Empty())
        {
            head = tail = temp;
        }
        else
        {
            temp->prev->next = temp;
            temp->next=0;
        }
    }
    file.close();
}

【讨论】:

  • 兄弟我完全无法理解你刚才所说的:D count 是一个静态变量,每次在 BookStoreDatabase 类 中创建一本书时都会递增。 & 当它增加时,我将它的副本放在书的节点中作为它的 ID。所以书的ID是自动生成的。示例:Book ID 1 -> C++ 中的 OOP Book ID 2 -> C++ 中的 DataStructures 我还在 BookStoreDataBasse 类 中编写了一个方法,以通过 ID #、或按其名称或按它的作者。
  • 好的,我发帖的时候很着急——我的意思是 Book 类的每个元素可能需要按预定顺序单独写入文件,然后以相同的方式读回命令。我会让答案更具可读性...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多