2013-12-13 38 views
0

我有兩個矩形對象,我試圖用readcood()讀取文本文件中的不同行,但是當我運行這個時,我從文本文件中得到相同的行。如何從文本文件中爲不同的對象讀取單獨的行?

#include<iostream> 
#include<fstream> 
using namespace std; 

class rect{ 
    int xcood[3],ycood[3],x1,x2,x3,x4,y1,y2,y3,y4; 
public: 
    void readcood() 
    { 
    char dummy; 
    ifstream myfile; 
    myfile.open("coordinates.txt"); 
    for(int i=0;i<4;i++) 
     { 
     myfile>>xcood[i]>>dummy>>ycood[i]; 
     } 
    } 
    void printcood() 
    { 
    for(int i=0;i<4;i++) 
     { 
     cout<<xcood[i]<<"\t"<<ycood[i]<<endl; 
     } 
    } 
}; 


int main() 
{ 
    char dummy; 
    string coordinates; 
    rect rectangle1,rectangle2; 
    rectangle1.readcood(); 
    rectangle2.readcood(); 
    rectangle1.printcood(); 
    rectangle2.printcood(); 
} 

回答

3

這是因爲你在函數中打開文件。當函數返回時,文件流對象將被破壞,所有你所做的都將丟失。

您可以在main函數中打開它並將其傳遞給參考讀取函數。

另一種解決方案是將open函數添加到您的rect類中,該函數打開文件並使文件流成爲該類的成員。

但是,我建議的解決方案是使您自己的重載輸入功能,需要一個rect對象,並讀入。類似於

class rect 
{ 
public: 
    ... 

    friend std::istream& operator>>(std::istream& is, rect& r) 
    { 
     char dummy; 
     for (int i = 0; i < 3; ++i) 
      is >> r.xcood[i] >> dummy >> r.ycood[i]; 
     return is; 
    } 

    ... 
}; 

然後你可以簡單地做

std::ifstream file("some/path/file"); 
rect r1, r2; 
file >> r1 >> r2; 
+0

如何通過引用傳遞「myfile」? – Ray

+0

謝謝兄弟!我知道了。 – Ray

+0

@ user2836556順便說一句,你在閱讀代碼的時候,或者至少比你分配的更多。數組中只有三個條目,但只讀了四個條目。我在我的答案中更改了代碼,只讀了三個。 –