C ++中的文本文件阅读问题

时间:2012-11-03 12:32:11

标签: c++ file-io file-handling

我设计了一个基于链接列表的BookStore,其中书的属性将存储在节点和节点中。等等。在程序结束时,我必须将所有数据库保存到文本文件(我尝试过二进制读取但是该死的我让我死了,而且无法做到)&然后逐一重新加载每本书的所有信息。将它存储在节点和重新制作LinkList。 现在保存完成了&完全没问题。但我在阅读文本文件时遇到了问题。

在文件中保存结构是:::

BookID(int) - BookName(字符串) - 作者(字符串) - BookType(字符串) - 副本(长) - 价格(长) - '\ n'(转到下一行)

示例: 1 ObjectOrientedParadigm R.Lafore Coding 5 900 2 ObjectOrientedParadigm R.Lafore Coding 5 900 等等......

这是保存功能。

bool BookStoreDataBase<mytype>::save_all_data()
{
    if(!is_Empty()) //if list is not empty
    {
        BOOK<mytype> *temp = head;   //created a copy of head
        ofstream file("database.txt", ios_base::app); //created file, to write at the end (append)
        while(temp != tail) //while list ends
        {
            file<<temp->ID<<' '<<temp->bookName<<' '<<temp->author<<' '<<temp->book_type<<' '<<temp->copies<<' '<<temp->price<<' ';  //write all info
            temp = temp->next; //move temp to next node
        }
        file<<temp->ID<<' '<<temp->bookName<<' '<<temp->author<<' '<<temp->book_type<<' '<<temp->copies<<' '<<temp->price<<' '; //for last book's info
        return true; //to confirm sucessfull writing
    }
    else //if list is empty
    {
        return false; //to confirm error in writing
    }
}

问题::当我开始阅读时,第一行读得很好&amp;存储在列表中,但是下一次,我无法使文件从下一行读取,因此'\ n'。 &安培;这会造成问题。文件再次读取第一行&amp;第二个节点使用相同的数据创建。

加载功能:

void BookStoreDataBase<mytype>::load_all_data()
{
    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


    ifstream file("database.txt");
    while(file) //I have tried file.eof but its not working, don't know why
    {
        file>>ID>>bookName>>author>>book_type>>copies>>price>>status; //read file

        BOOK<mytype> *temp = new BOOK<mytype>(0, 0, bookName, author, book_type, copies, price);  //create a new node in memory and save all the data

        if(is_Empty()) //if list is empty, then make 1st node
        {
            head = tail = temp;
        }
        else //other wise make the next node
        {
            tail->next = temp;
            temp->prev = tail;
            tail = temp;
        }
    }
}

此外 阅读比真实记录少1次。即如果.txt具有4本书的记录,则创建3个节点(并且在每个节点中仅重复1个信息),而它应该读取&amp;创建4个节点!

我是初学者,非常感谢任何好的帮助。

2 个答案:

答案 0 :(得分:2)

我建议你使用std::getline()来获取整行,然后使用stringstream类来读取从那里到相应变量的所有内容。

答案 1 :(得分:1)

while (!file.eof())错了,while (file)错了。似乎每个新程序员都无法理解从文件中读取的正确方法。我希望我知道为什么,建议新手更容易。基本的误解似乎是新手认为你应该先测试文件的结尾,然后再读第二个。什么时候你应该首先阅读,然后看看读取是否失败。

这是从文件中读取的正确方法

while (file >> ID >> bookName >> author >> book_type >> copies >> price >> status)
{
}

尝试一下,看看还有哪些问题。

我刚刚注意到另一个问题,你试图读取你说的字符串状态,但在你的文件格式描述中没有状态。这是你认为的真正问题。