2013-07-15 58 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

感谢您提供这些建议 –