在C ++中:如何从文件读取到对象的向量

时间:2015-04-29 00:57:09

标签: c++ file class object vector

我想从用户指定为对象向量的文件名中读取数据。每个向量元素有五个不同的成员变量,我想读入。在文件中,将有多个条目(五个成员变量的组)必须读入每个向量元素。到目前为止,这是我的(不完整)代码:

while (!inputFile.eof())
            {
                for (unsigned int count = 0; inputFile.eof(); count++)
                {
                    cout << "Vehicle #" << (count + 1) << endl;

                    inputFile >> temp[count].setVIN();                              
                    cout << "VIN: " << temp[count].getVIN() << endl;            
                    inputFile >> temp[count].setMake() << endl;                 
                    cout << "Make: " << temp[count].getMake() << endl;          
                    inputFile >> temp[count].setModel() << endl;                
                    cout << "Model: " << temp[count].getModel() << endl;        
                    inputFile >> temp[count].setYear() << endl;                 
                    cout << "Year: " << temp[count].getYear() << endl;          
                    inputFile >> temp[count].setPrice() << endl;                
                    cout << "Price: " << temp[count].getPrice() << endl         
                         << endl;
                }
            }

但是,此代码已存在一些问题。其中之一是setVIN()setMake()setModel()setYear()setPrice成员函数需要一个参数(设置VIN的值,制作,模型等)。这是类声明:

class Vehicle
{
    private:

        string VIN;
        string make;
        string model;
        int    year;
        double price;

    public:
        Vehicle(string, string, string, int, double);
        Vehicle();
        string getVIN();
        string getMake();
        string getModel();
        int    getYear();
        double getPrice();
        void   setVIN(string);
        void   setMake(string);
        void   setModel(string);
        void   setYear(int);
        void   setPrice(double);
 };

最后,考虑到我发布的第一个代码块,在inputFile >> .....行的错误消息中指出“无操作数”&gt;&gt;'匹配这些操作数操作数类型是std :: ifstream&gt;&gt; void“

有人可以帮助我度过这个障碍吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

首先这段代码很糟糕。

inputFile >> temp[count].getVIN();

它从getVIN()获取一个字符串,然后尝试读入临时字符串。你需要使用类似的东西:

string vin;
inputFile >> vin;
temp[count].setVin(vin); 

其次,创建一个读取整个对象的operator>>更加理想,以便你的循环更清晰。

istream& operator>>(istream& is, Vehicle & v) {
   string vin;
   inputFile >> vin;
   v.setVin(vin);
   ...
}

如果你把它变成一个成员函数,你可以改写

// You probably want to add error checking to each read too
void Vehicle::readFromStream(istream & is) {
   is>>vin;
   is>>make;
   ...
}


istream& operator>>(istream& is, Vehicle & v) {
   v.readFromStream(is);
   return is;
}

然后你的循环将成为

Vechicle v;
while(input>>v) {
   std::cout<<v<<std::endl;
}

只要你添加一个明智的operator<<(以同样的方式。)

如果你真的想将它们存储在列表中,那么:

std::vector<Vehicle> vehicles;
Vehicle v;
while(input>>v) {
  vehicles.push_back(v);
}