c++ - 将txt文件读入链表

标签 c++ linked-list

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

#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;
}

最佳答案

在您的文件中,Charlie Batch 等等。 当你阅读它时,你认为会发生什么? 名称将变为 Charlie;位置将变为 Batch

发生这种情况是因为读取数据直到遇到空格。

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

关于c++ - 将txt文件读入链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760499/

相关文章:

c++ - 分配空间中的链表?

c - 链表插入函数 - 通过指针传递列表

java - 为什么 Java 不接受我的 Generic LinkedList,却接受它自己的 LinkedList?

java - 一种对 DoubleLinkedList 中数百万个单词进行排序的有效算法

c++ - 清除 QSerial 正在使用的 QList

c++ - 为什么在 C++11 中流仍然转换为指针?

c++ - 如何累积 3D 三角形网格的边?在 C C++ 中计算网格边缘的算法?

c++ - 链表打印/删除功能炸弹程序

c++ - 哪个事件属于 qt c++ 中的窗口焦点更改?

c++ - 如果只有属性的成员函数是 noexcept,如何声明 noexcept?