参考:https://blog.csdn.net/leo_888/article/details/80681184
需要导入大批dat文件,一开始的想法是遍历然后获取文件夹下所有文件的名,代码如下。
获取全部文件的函数:
(这段代码网上都有,但后来发现这个函数获得的文件名并不是按原来的数字排列顺序,会影响后续的处理。)
void getFiles(string path, vector<string> &files) {
_int64 hFile = 0; //注意编译器环境 x86环境需要改成 long hFile =0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
do {
if ((fileinfo.attrib & _A_SUBDIR)) {
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
else {
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
}
while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);}}
下面这段代码是用C的库写的,可做参考。
之后改变策略,因为事先知道文件名以及文件名的顺序,因此用sprint_f循环把文件名全都打出来存入vector<string>中,后续再循环打开文件进行处理。
char FileName[30] = { 0 };
vector <string> name;
for (int i = 1; i <= 1147; i++)
{
sprintf_s(FileName,sizeof(FileName), "Z://20171115//%d.dat", i);
name.push_back(FileName);
}
读取文件的方法
1. 直接读为一维数组:
vector<float> rawdata;
ifstream inf;
inf.open(name[0].c_str());
while (!inf.eof())
{
float temp;
inf >> temp;
rawdata.push_back(temp);
2.存为二维数组:
方法1(未实施测试):
vector<vector<int> > num;
while(getline(f, str))
{
istringstream input(str);
vector<int> tmp;
int a;
while(input >> a)
tmp.push_back(a);
num.push_back(tmp);
———————————————
方法二:
这个方法测试过,但是失败了我也不知道为啥,数据只能读进去第一行的。
//float(*data)[2048] = new float [280][2048]; (定义data[280]的类型为 float[2048] 此处开辟的空间是连续的)
方法三:
这个方法也测试过了,读取数据也失败了,很迷惑。
// float ** data = new float* [2048];
//for (int i = 0; i < 280; ++i)
//{
// data[i] = new float[2048];
//}
//for (int i = 0; i < 280; ++i)
//{
// for (int j = 0; j < 2048; ++j)
// {
// data[i][j] = i * 2048 + j;
// }
//}
方法4:
(此方法可行)
static float data[280][2048] = { 0 };
ifstream inf;
inf.open(name[0].c_str());
while (!inf.eof())
{
for (int i = 0; i < 280; i++)
{
for (int ii=0;ii<2048;ii++)
{
inf>>data[i][ii];
}
}
}
return 0;
}
VC++中使用内存映射文件处理大文件
https://www.cctry.com/thread-479-1-1.html
内存映射文件使用方法
https://www.cctry.com/thread-54602-1-1.html