如何从文本文件加载链接列表?

时间:2012-02-08 00:04:38

标签: c++ loops linked-list

问候我一直在做家庭作业,我必须创建一个链接列表程序,可以从文本文件中保存和恢复其数据。我已经完成了大部分工作但是我在使用从它创建的文本文件中的数据恢复链表时遇到了一些问题。当我恢复它时,最后一个元素重复两次。我相信它与循环有关,但我不确定我是否包括我的任务的整个范围。

以下是我到目前为止编写的代码:

ListNode.h

#pragma once
template<class T> class List;
template<class T>

class ListNode
{
 friend class List<T>;
public:
 ListNode(const T&);
 T getData()const;
private:
 T data;
 ListNode<T>*next;
};//end ListNode class

template<class T>
ListNode<T>::ListNode( const T &info):data(info), next(NULL)
{
}//end default constructor
template<class T>
T ListNode<T>::getData()const
{
 return data;
}//end function getData 

List.h

#pragma once
#include<iostream>
#include <fstream>
using namespace :: std;
#include "ListNode.h"
template<class T> 
class List 
{
private:
 ListNode<T> *head;
 int size;
 ListNode<T> *find(int index) const;
public:
 List();
 List(const List<T> &aList);
 ~List();
 int getLength() const;
 void insert (int index, T tempData);
 void remove(int index);
 void retrieve(int index, T &tempData);
 bool isEmpty() const;
 void print() const;
 void save();
 void restore();
};//end List class 

功能破损:

template <class T>
void List<T>::restore()
 {
     ifstream inFile;
     inFile.open("listFile.txt");

     T value=0;
     int index, check =0;

     cout << "Now reading the data from the text file..." << endl;
         //inFile >> value;
         //cout << "Value is : " << value << endl;


        while (inFile != NULL) 
        {
            inFile >> value;
            index = getLength();
            cout << value << endl;
            insert(index+1, value);

            inFile.close();

        } 


 } // end function restore

测试期间保存到文本文件的链接列表数据是:

35
45
55
65

从文本文件恢复链接列表时,这是它的内容:

35
45
55
65
65

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

令我惊讶的是,您的restore功能完全正常。但是,是的,它正在重复最后一个元素。试试这个:

while(inFile >> value)
  ...

修改:
好吧,试试这个:

while(inFile >> value)
{
  cout << value << endl;
}

是否正确显示了值?

答案 1 :(得分:-1)

前一段时间我的一个程序出现了这个问题。我花了一段时间才弄清楚,我不确定它是否是同一个问题,但再次检查输入文件。如果在最后一个数字后面留一个额外的行,编译器将返回最后一个数字两次。

示例:

1

2

3

4

5

(额外的一行)

只需删除额外的行。

答案 2 :(得分:-1)

哪一个是你的名单的负责人?您可以使用while循环甚至if语句遍历每个节点并加载它们。