2015-04-29 94 views
-1

我想從用戶指定的對象向量的文件名中讀取數據。每個向量元素有五個不同的成員變量,我想讀入。在該文件中,將有多個條目(五個成員變量的組),必須讀入每個向量元素。以下是我的(不完整)代碼:在C++中:如何從文件中讀取對象的向量

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,Make,Model等的值)。下面是類的聲明:

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 >> .....的錯誤消息指出「無操作數‘>>’線路匹配這些操作數操作數類型的std :: ifstream >> void「

有人能幫助我度過這段路嗎?

謝謝!

+1

['while(!inputFile.eof())'](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) –

+0

另外,如何'inputFile >> temp [count] .setVIN();'應該工作?實際的簽名是'void setVIN(string);'哪個需要一個'std :: string'作爲參數並返回'void'。這絕不是一個合適的語法來調用這個函數。 –

+0

創建一個讀取一個對象的函數,然後如果讀取成功,則將該對象放入向量中。 –

回答

2

首先,這段代碼不好。

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

它從getVIN()一個字符串,然後嘗試讀取到臨時字符串。你,而不是需要使用類似:

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

其次它更ideomatic創建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); 
}