dat文件读取操作

参考:

https://blog.csdn.net/xiaogugood/article/details/21447431

https://www.cnblogs.com/lsgxeva/p/8087148.html

文件内容大概如图所示:

DimOfX
1
NumOfSamples
11
X		Y
0	    3.027209981
0.1	    -0.656576774
0.2	    -0.639727106
0.3	    -0.015576734
0.4	    0.114776975
0.5	    0.909297427
0.6	    -0.149437807
0.7	    -4.605754038
0.8	    -4.949130441
0.9	    5.711950339
1	    15.82973195

需要读取1,11,以及坐标点数组

使用getline函数和ifstream,然而遇到了问题。

问题:

unsigned short DimOfX;

ifstream SampleFile(“aa.dat”, ios::in);

getline(SampleFile, text);

getline(SampleFile, text);

SampleFile>> DimOfX;

第一个getline读取字符串DimOfX,第二个getline读取1,然而输出结果却是DimOfX等于0;string中的getline应该是不包含结束符的,看来使用ifstream流不对,里面可能包含了结束符号,text内容是对的。那就使用string text作为输入流,然后输入DimOfX。

istringstream istr;
getline(SampleFile, text);
getline(SampleFile, text);
istr.str(text);
istr >> DimOfX;
cout<< DimOfX << endl;
istr.clear();//进行多次转换的时候,必须调用istringstream的成员函数clear().

总的程序如下(使用了Eigen库):

unsigned short DimOfX, NumOfSamples, i, j;
std::string text;

ifstream SampleFile(INPUT_SAMPLE_FILENAME.c_str(), ios::in);
istringstream istr;

if (!SampleFile.is_open())
		throw exception("->ERROR: File open failed!\n");
getline(SampleFile, text);
getline(SampleFile, text);
istr.str(text);
istr >> DimOfX;
istr.clear();   //进行多次转换的时候,必须调用istringstream的成员函数clear().
getline(SampleFile, text);
getline(SampleFile, text);
istr.str(text);
istr >> NumOfSamples;
istr.clear();

X.resize(NumOfSamples, DimOfX);
Y.resize(NumOfSamples);
getline(SampleFile, text);
for (i = 0; i < NumOfSamples; ++i){
	getline(SampleFile, text);
	istr.str(text);
	for (j = 0; j < DimOfX; ++j){
		istr >> X(i,j);
	}
	istr >> Y(i);
	istr.clear();
}
SampleFile.close();

本人菜菜鸟,可能说的理由不太对,如有错误,敬请指正。

你可能感兴趣的:(dat文件读取操作)