1

*.txtファイルからリンクリストにデータを読み込もうとしています。このファイルは、16種類のデータが行に配置され、各データ型の間にタブが配置されて設定されています。私はこれに関していくつかの問題を抱えています。コンパイラはエラーを出しませんが、プログラムを実行して読み取るファイル名を入力しても、何も起こりません。while(!din.eof())行(以下の行27)をforループに置き換えてみましたがfor(int i=0; i<NUM_LINES; i++)、これは役に立ったようですが、最初の3つの要素(すべての文字列型)の後にゼロの行が続き、この行はループ。問題が以下にあると私が信じる方法を含めました。誰かが私のコードを見て、問題がどこにあるのか教えてくれないかと思っていました。ありがとう。

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

2 に答える 2

0

In your file you have, Charlie Batch and so on. What do you think will happen when you read it? Name will become Charlie; position will become Batch.

This happens because the data is read until a whitespace is met.

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

于 2013-02-07T21:25:17.533 に答える
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;

}
于 2013-02-07T20:40:19.933 に答える