使用成员函数从文件加载数据

时间:2016-09-14 02:20:19

标签: c++

人员类应具有以下功能: •构造函数 •析构函数 - 可选 •获取 - 从输入流中读取名字,姓氏和年龄 •Put - 将姓氏,名字和年龄写入输出流

我试图实现get(),以便它可以从文件中读取文本,但我有点卡住了。

#include <iostream>
#include <string>
#include "person.h";
using namespace std;

person::person()
{  
   fName = "Default";
   lName = "Default";
   age   = 0;
}

bool person::get(istream &in)
{ 
  in >> fName >> lName >> age;
  return(in.good());
}

// Output
void person::put(ostream &out)
{ 
  out << lName << fName << age;
}

person.h

#include <iostream>
using namespace std;

// Person header.h
class person
{  public:
        person();                       // Empty constructor.
        bool get(istream &);            // Read input from file.
        void put(ostream &);            // Write to an output stream.

        // Operators to compare.
        bool operator < (person);       //lesser.
        bool operator > (person);       //greater.
        bool operator == (person);      //equal.

        string fName;                   //First Name.
        string lName;                   //Last Name.
        int age;                        //Age.
};

的main.cpp

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;

#include "person.h"

void main()
{ 
  int i,x;
  string name;
  fstream infile;
  person info[20];

  //Open File.
  cout << "Enter the file name: ";
  cin >> name;
  infile.open(name.data(),ios::in);


  // loop
  while (!infile.eof())
  {  

     if(infile.good())

        {
            for (i = 0; i < 20; i++)
            { 

              info[i].get(cin);
            }

        };

  }; 
  infile.close();
}

每当我尝试使用get()将文件中的输入加载到数组时,它就会冻结。但是,当我这样做时它会起作用:

infile >> info[i].lName >> info[i].fName >> info[i].age;

这是我的文件数据。

Ann Christensen  70
Carlos Morales   68
David Bowman     45
Frank Bowman     37
John Bowman      30
Kathleen Gueller 34
Mark Bowman      42
Mark Bowman      13
Richard Bowman   47
Susan Cox        36

谢谢。

1 个答案:

答案 0 :(得分:-1)

如果我正确阅读您的代码,这是因为您在info[i].get(cin)时正在呼叫info[i].get(infile)。它现在的样子,它试图从控制台读取输入,因此是#34;悬挂&#34;。

另外,我认为for (i = 0; i < 20; i++)循环在这里并不好。这里更好的方法是使用vector来保持正确阅读person

std::vector<person> info;
//...

// loop
while (!infile.eof())
{  
    if(infile.good())
    {
        person new_person;
        if (new_person.get(infile))
            info.push_back(new_person);
    }
}

甚至更简单:

person new_person;
while (new_person.get(infile))  //you can keep overwriting the object
    info.push_back(new_person); //because vector makes a copy of it