2013-07-15 60 views
1

仍然是C++的初學者,我無法弄清楚如何使用fstream。 我想要將其值分配給一組在我的程序double變量,從 一個.txt.csv文件(.csv可能是出於實際考慮好。)如何從.txt或.csv文件導入數值變量

比方說,我的input_file.csv看起來像這樣:

10 
0 
20 
0.4 
0.1333382222 
0 
0.5 
10 
20 
0.76 
0.3 
0.1 
0.2 

這些價值觀應該被分配到在我的代碼以下變量(第一個聲明爲等於0):

/// geometry 
double Dist=0; ///Distance between the 2 

double PosAi = 0; 
double PosAo = 0; 
double PosBi = 0; 
double PosBo = 0; ///positions i/o 

/// densities 

double iDA=0; 
double oDA=0; 
double iDAtop=0; 
double oDAtop=0; /// Left 

double iDB=0; 
double oDB=0; 
double iDBtop=0; 
double oDBtop=0; /// Right 

我想讀的input_file.csv的值,並將它們分配給我的變量,因此,如果I型:

cout<<Dist<<" "<<PosAi<<" "<<PosAo<<" "<< 

...........等。 ;

我得到以下列表中的控制檯上:

10 0 20 0.4 0.1333382222 0 0.5 10 20 0.76 0.3 0.1 0.2 

但我不知道如何使用fsteam對於這一點,你能幫一點? 謝謝!


確定這裏就是答案,如果以往任何時候都像我一些初學者得到了同樣的問題:如果你知道如何打印一組變量與cout

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

/// geometry 

double Dist=0; ///Distance between the 2 
double PosAi = 0; 
double PosAo = 0; 
double PosBi = 0; 
double PosBo = 0; ///positions i/o 

/// densities 

double iDA=0; 
double oDA=0; 
double iDAtop=0; 
double oDAtop=0; /// Left 
double iDB=0; 
double oDB=0; 
double iDBtop=0; 
double oDBtop=0; /// Right 

int main() 
{ 
ifstream ifs ("input.csv"); 
if (!ifs) 
    // process error 
ifs >> Dist; 
ifs >> PosAi; 
ifs >> PosAo; 
ifs >> PosBi; 
ifs >> PosBo; 
ifs >> iDA; 
ifs >> oDA; 
ifs >> iDAtop; 
ifs >> oDAtop; 
ifs >> iDB; 
ifs >> oDB; 
ifs >> iDBtop; 
ifs >> oDBtop; 

    // print variables 

    cout << Dist << " " << PosAi << " " << PosAo << " " << PosBi << " " << PosBo << " " << iDA << " " << oDA << " " << iDAtop << " " << oDAtop << " " << iDB << " " << oDB << " " << iDBtop << " " << oDBtop << endl; 
} 

感謝

+0

如果沒有你向我們展示你已經嘗試過的一點點東西,很難幫助你,因爲我告訴你如何去做你已經知道的事情並不重要。 –

+0

這個編輯後更清晰嗎? –

+0

@ adrienlucca.wordpress.com你不使用'fstream',你使用'ofstream'。你可能不直接訪問它,而是通過'istream&'。 –

回答

1
ifstream ifs ("input_file.txt"); 
if (!ifs) 
    // process error 
ifs >> DISTAB; 
ifs >> POSAstart; 
.... 
+0

太棒了!謝謝。我在像我這樣的noobs問題中添加代碼! –

+0

順便說一句,你的輸入不用逗號分隔,所以.csv擴展名不太準確。 (如果你用逗號分開值,它只會使它們讀得更復雜。) – jsp

+0

謝謝,我知道我只需要一個.txt文件來處理那種數據結構。然而,這只是一個測試,因爲我想嘗試另一種結構,例如:'12.3,36.45,27.36'歡迎任何建議! –

1

,你知道如何用輸入流來閱讀它 - 這是相反的。只是扭轉你cout調用的箭頭:

myInputFile >> Dist >> PosAi >> PosAo >> ...; 

NB即輸入流只能採取實際變量作爲自變量,以>>,相反,可以採取臨時對象,怎麼樣,你使用印刷的<< " "空間輸出流。但幸運的是,輸入流會自動消除空白,所以你可以忽略它。因此,我在前一行中的示例是正確的。

此外,cout是在iostream中預先聲明的,但您需要聲明輸入流。 ifstream取名字的文件的讀取,它的第一個參數:

ifstream myInputFile ("input_file.csv"); 
+0

這不完全相反。你提到的分隔符必須被明確地輸出,但是在輸入時會被隱式地跳過(假設它們只是空白的--- CVS文件通常使用一個逗號,它必須被顯式讀取和跳過)。更重要的是,您必須在使用您輸入的任何值之前檢查輸入是否成功;否則,你有未定義的行爲。 –

1

首先,你不(通常)使用此一fstream,您使用的 ifstream。你通常不直接訪問它,但通過istream& ;就像ofstream源自 ostream, ifstream derives from istream , so that you can use istream &`獨立於流的類型。

最後,對於每個<<操作上ostream,有 相應>>操作上istream,所以如果你能做到 std::cout << x,你可以做input >> x(當然,你 通常不會做std::cout << x ,你做output << x,其中 outputostream&傳遞給函數—也許 std::cout,但也許一個std::ofstream,或其他一些 ostream)。當然有差異:輸出是 一般比輸入更容易,因爲你控制源 (你的變量);輸入需要很多錯誤檢查,因爲 你可以從字面上接收任何東西。特別是,在您確認輸入 成功之前,您不能使用任何輸入值。在輸出的情況下,通常只在輸出結束時(在最後一次刷新到 std::cout之後,或在關閉std::ofstream之後)執行一次 。

+0

感謝您提供這些建議 –