从txt文件读取到链接列表

时间:2013-02-07 20:35:28

标签: c++ linked-list

我试图将* .txt文件中的数据读入链表。该文件设置有16种不同类型的数据排列成行,每种数据类型之间有选项卡。我有几个问题。编译器没有错误,但是当我运行程序并输入要读取的文件名时,没有任何反应。我尝试用for循环while(!din.eof())替换for(int i=0; i<NUM_LINES; i++)行(下面的第27行),这似乎有所帮助,但我得到了前三个元素(所有字符串类型)后跟一行零,这条线重复直到循环结束。我已经包含了我认为问题位于下面的方法。我想知道是否有人可以查看我的代码并让我知道问题出在哪里。感谢。

#include <iostream>
#include <fstream>
using namespace std;

class Node
{
 public:
   // Constructors
   Node();
   Node(const string name, const string position, const string team, const int g, const int att, const float attg, const int cmp, const float pct, const int yds, const float ydsg, const int lng, const int td, const int inte, const int sck, const int sckyl, const float rating);
   Node(const Node & node);
   ~Node();

   // Methods
   bool readData();
   void setNext(Node* next);
   void print() const;

 private:
   string Name;
   string Position;
   string Team;
   int G;
   int Att;
   float AttG;
   int Cmp;
   float Pct;
   int Yds;
   float YdsG;
   int Lng;
   int TD;
   int Int;
   int Sck;
   int SckYL;
   float Rating;
   Node *Next;
};

//----------------------------------------------
// Constructor method
//----------------------------------------------
Node::Node()
{
   Name = "";
   Position = "";
   Team = "";
   G = 0;
   Att = 0;
   AttG = 0.0;
   Cmp = 0;
   Pct = 0.0;
   Yds = 0;
   YdsG = 0.0;
   Lng = 0;
   TD = 0;
   Int = 0;
   Sck = 0;
   SckYL = 0;
   Rating = 0.0;
   Next = NULL;
}

//----------------------------------------------
// Constructor method with parameters
//----------------------------------------------
Node::Node(const string name, const string position, const string team, const int g, const int att, const float attg, const int cmp, const float pct, const int yds, const float ydsg, const int lng, const int td, const int inte, const int sck, const int sckyl, const float rating)
{
   Name = name;
   Position = position;
   Team = team;
   G = g;
   Att = att;
   AttG = attg;
   Cmp = cmp;
   Pct = pct;
   Yds = yds;
   YdsG = ydsg;
   Lng = lng;
   TD = td;
   Int = inte;
   Sck = sck;
   SckYL = sckyl;
   Rating = rating;
   Next = NULL;
}

//----------------------------------------------
// Copy constructor method
//----------------------------------------------
Node::Node(const Node & node)
{
   Name = node.Name;
   Position = node.Position;
   Team = node.Team;
   G = node.G;
   Att = node.Att;
   AttG = node.AttG;
   Cmp = node.Cmp;
   Pct = node.Pct;
   Yds = node.Yds;
   YdsG = node.YdsG;
   Lng = node.Lng;
   TD = node.TD;
   Int = node.Int;
   Sck = node.Sck;
   SckYL = node.SckYL;
   Rating = node.Rating;
   Next = NULL;
}

//----------------------------------------------
// Destructor method
//----------------------------------------------
Node::~Node()
{
}

//----------------------------------------------
// Method:   readData
// Purpose:  Read data from file into linked list, and print contents of the list.
//----------------------------------------------
bool Node::readData()
{
   // Declare local variables
   string name, position, team;
      name = position = team = "";
   int g, att, cmp, yds, lng, td, inte, sck, sckyl;
      g = att = cmp = yds = lng = td = inte = sck = sckyl = 0;
   float attg, pct, ydsg, rating;
      attg = pct = ydsg = rating = 0.0;

   // Get file name
   string filename = "";
   cout << "Enter file name: ";
   cin >> filename;

   // Open input file
   ifstream din;
   din.open(filename.c_str());
   if (din.fail())
   {
      cerr << "Could not open file: " << filename << endl;
      return false;
   }

   // Read data
   Node *head = NULL;
   while (!din.eof())
   {
      din >> name >> position >> team >> g >> att >> attg >> cmp >> pct >> yds >> ydsg >> lng >> td >> inte >> sck >> sckyl >> rating;

      Node *temp = new Node(name, position, team, g, att, attg, cmp, pct, yds, ydsg, lng, td, inte, sck, sckyl, rating);
      temp->setNext(head);
      head = temp;
   }

   din.close();
   head->print();
   return true;
}

//----------------------------------------------
// setNext method
//----------------------------------------------
void Node::setNext(Node* next)
{
   Next = next;
}

//----------------------------------------------
// Print method
//----------------------------------------------
void Node::print() const
{
   cout << Name << "    " << Position << "    " << Team << "    " << G << "    " << Att << "    " << AttG << "    "
        << Cmp << "    " << Pct << "    " << Yds << "    " << YdsG << "    " << Lng << "    " << TD << "    " << Int << "    "
        << Sck << "    " << SckYL << "    " << Rating;
   if (Next != NULL)
      Next->print();
}

//----------------------------------------------
// Main program
//----------------------------------------------

int main()
{
   Node list;
   if (list.readData())
      cout << "Success" << endl;
   else
      cout << "Fail" << endl;

   return 0;
}

2 个答案:

答案 0 :(得分:0)

您是否尝试过启动循环?获取文件的第一行,然后执行while语句。在while语句中,创建新节点,然后获取下一行。结束循环的代码块。

// Read data
Node *head = NULL;

  din >> name >> position >> team >> g >> att >> attg >> cmp >> pct >> yds >> ydsg >> lng >> td >> inte >> sck >> sckyl >> rating;

while (!din.eof())
{

  Node *temp = new Node(name, position, team, g, att, attg, cmp, pct, yds, ydsg, lng, td, inte, sck, sckyl, rating);
  temp->setNext(head);
  head = temp;

  din >> name >> position >> team >> g >> att >> attg >> cmp >> pct >> yds >> ydsg >> lng >> td >> inte >> sck >> sckyl >> rating;

}

答案 1 :(得分:0)

在您的文件中,您有Charlie Batch等等。 你读到它后会怎么想? 姓名将变为Charlie;职位将变为Batch

这是因为读取数据直到满足空格。

http://cplusplus.com/reference/fstream/fstream/?kw=fstream