2012-05-30 31 views
0

我正在寫一個程序讀取每行中包含兩個值的文件。這些值應該存儲在兩個向量中,xVals和yVals。因此我使用push_back函數,但我希望我的代碼更美觀。現在是這樣的:傳遞fstream「>>」作爲函數參數

ifstream file; 
file.open("foo.txt"); 
double TempVal; 
while(file >> TempVal){ 
    xVals.push_back(TempVal); 
    file >> TempVal; 
    yVals.push_back(TempVal); 
} 

什麼我目前正在尋找的是這樣的一個(只是重要的線)的解決方案:

while(file >> xVals.push_back(??) >> yVals.push_back(??)) 

問號表示「我不知道該怎麼度日「>>」傳遞的值有... 有一個簡單的(更容易比上述三條線),或者更好的方式來實現這一目標?:-)

感謝

+1

美在眼中r,我想,但是你稱之爲美麗的,我叫**混淆**。 –

+0

你真的相信你的代碼在無法讀取時會更漂亮嗎? – undu

+0

嗯,我可以避免一個臨時變量;-) – AnatraIlDuck

回答

5

你可以做些什麼像這樣:

double tempX, tempY; 
while(file >> tempX >> tempY) 
{ 
    xVals.push_back(tempX); 
    yVals.push_back(tempY); 
} 

如果你真的想要的東西美麗,你會定義一個Point類執行流提取/插入,然後只需使用一種算法:

std::vector<Point> points; 
std::copy(
    std::istream_iterator<Point>(file), std::istream_iterator<Point>() 
    , std::back_inserter(points) 
); 
+2

+1第一次重構反映的對稱性遠優於OP的代碼。 – dasblinkenlight

+0

(第一個)會這樣做,但它使用兩個臨時變量。第二個我必須反映的...... – AnatraIlDuck

+0

@Vincent:你有兩個時態組件,兩個臨時變量有什麼錯誤? –

0

只是爲了避免使用TempVal你可以直接在矢量實例上操作:

while(file.good() && !file.eof()) 
{ 
    xVals.resize(xVals.size() + 1,0.0); 
    yVals.resize(yVals.size() + 1,0.0); 
    file >> xVals.back() >> yVals.back(); 
} 
+0

好的,這個解決方案也很好,但是如上所述,臨時變量並沒有像我想到的那麼糟:-) – AnatraIlDuck

+0

請不要使用'.eof()'作爲循環條件。它幾乎總是產生錯誤代碼,就像它在這種情況下一樣。提供格式錯誤的輸入時,您的代碼會執行無限循環。 –

+0

@Rob:增加了對輸入流的檢查。現在好多了?如果這沒有幫助,請進一步解釋。 –