我搜索我的问题但没有找到答案。 我尝试在C ++中读取一个文件中的双值表到二维数组的双精度数,但我无法使其工作。
该文件中充满了我不需要的其他垃圾,该表由“BEGIN TABLE”和“END TABLE”括起来。该表有5个双行连续,空格分隔符和未知行数。所以文件看起来像这样
junk
.
.
.
BEGIN TABLE
0.12145 0.23234 2.32423 1.32422 0.12345
1.34534 1.23423 5.21323 3.12313 1.22231
.
.
.
2.32422 3.23423 1.12345 4.34532 2.23423
END TABLE
首先,我查看文件,搜索表的开头和结尾,并为我的数组分配内存:
char sBuffer[100];
double** darrTable;
int iRes = -1;
iRes = fopen_s(&pFile, strFile, "rb");
if (iRes==0)
{
int ilines = 0;
bool beof = false;
bool bfound = false;
//get number of lines for array allocation
while(!beof)
{
fgets(sBuffer,100,pFile);
if(strstr(sBuffer,"END TABLE"))
{
bfound = false;
beof = true;
}
if(bfound) ilines++;
if(strstr(sBuffer,"BEGIN TABLE"))bfound = true;
}
darrTable = new double*[ilines+1];
for(int i = 0; i < (ilines+1); ++i) darrTable [i] = new double[5];
}
在另一个代码块中我再次遍历这些行并想要读出字符串,但它不起作用
int ilines = 0;
bool beof = false;
bool bfound = false;
while(!beof)
{
fgets(sBuffer,100,pFile);
if(strstr(sBuffer,"END TABLE"))
{
bfound = false;
beof = true;
}
if(bfound)
{
sscanf_s(sBuffer,"%d %d %d %d %d",&darrTable [ilines][0],&darrTable [ilines][1],&darrTable [ilines][2],&darrTable [ilines][3],&darrTable [ilines][4]);
ilines++;
}
if(strstr(sBuffer,"BEGIN TABLE"))bfound = true;
}
它编译并运行没有错误,但我得到的是一个满是0.000000000的darrTable数组。 sscanf_s returs 1巫婆建议找到1个值,但那个值都是0。
我使用的是VisualStudio 2005 SP0。
对不起我的英文,感谢您的帮助。
答案 0 :(得分:0)
使用C ++样式
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
std::vector<std::vector<double>> ParseFile(const std::string& filename)
{
std::vector<std::vector<double>> data;
std::ifstream file(filename.c_str());
std::string line;
while (std::getline(file, line))
{
if (line == "BEGIN TABLE")
{
while (std::getline(file, line))
{
if (line == "END TABLE")
{
break;
}
else
{
data.push_back(std::vector<double>());
std::istringstream ss(line);
double temp;
while (ss >> temp)
{
data.back().push_back(temp);
}
if (data.back().size() != 5)
{
// missing or extra data
}
}
}
break; // END TABLE missing
}
}
if (data.empty())
{
// BEGIN TABLE missing or there was no data lines
}
return data;
}