#include<vector>
#include<fstream>
#include <string>
#include <sstream>
#include<iostream>
using namespace std;
template<typename T>
vector<vector<T>> DataOut(ifstream& fin, int n, int size)
{
string line;
stringstream lineStream;
vector<vector<T>> Data;
vector<T> vecTmp;
vecTmp.resize(size);
for (int i = 0; i < n; i++)
{
getline(fin, line);
lineStream << line;
for (int j = 0; j < size; j++)
lineStream >> vecTmp[j];
Data.push_back(vecTmp);
lineStream.clear();
}
return Data;
}
template<typename T>
vector<vector<T>> DataOutWithId(ifstream& fin, int n, int size)
{
string line;
int id;
stringstream lineStream;
vector<vector<T>> Data;
vector<T> vecTmp;
vecTmp.resize(size);
for (int i = 0; i < n; i++)
{
getline(fin, line);
lineStream << line;
lineStream >> id;
for (int j = 0; j < size; j++)
lineStream >> vecTmp[j];
Data.push_back(vecTmp);
lineStream.clear();
}
return Data;
}
vector<vector<double>> Read_Set
(
int frame,
string setName,
string inVariableName,
int setType,
int setId
)
{
for (int i = 0; i < inVariableName.size(); i++)
{
inVariableName[i] = tolower(inVariableName[i]);
}
string judgeInVariableName;
if (inVariableName == "u")
judgeInVariableName = "displacement";
else if (inVariableName == "coord")
judgeInVariableName = "coord";
else if (inVariableName == "density")
judgeInVariableName = "density";
else if (inVariableName == "resistivity")
judgeInVariableName = "resistivity";
else if (inVariableName == "temperature")
judgeInVariableName = "temperature";
else if (inVariableName == "Permittivity")
judgeInVariableName = "permittivity";
vector<vector<int>> phyDataInt;
vector<vector<float>> phyDataFloat;
vector<vector<double>> phyDataDouble;
stringstream lineStream;
string line;
string temp;
string temp1;
string temp2;
int frameTmp;
string setNameTmp;
string setTypeTmp;
string judgeInVariableNameTmp;
int dataSizeTmp;
int numCompTmp;
string dataTypeTmp;
string inFile;
inFile = inFile + to_string(frame) + "_" + judgeInVariableName + "_" + setName + ".txt";
ifstream fin;
fin.open(inFile.c_str(), ios::in);
if (!fin.is_open())
{
cout << "File open fail" << endl;
return phyDataDouble;
}
if (fin)
{
while (getline(fin, line))
{
while (line[0] == '\t')
line.erase(0, 1);
if ((line[0] == '*'))
{
lineStream << line;
lineStream >> temp;
lineStream >> frameTmp;
lineStream >> setNameTmp;
lineStream >> setTypeTmp;
lineStream.clear();
getline(fin, line);
lineStream << line;
lineStream >> judgeInVariableNameTmp;
lineStream >> dataSizeTmp;
lineStream >> numCompTmp;
lineStream >> dataTypeTmp;
lineStream.clear();
if (frameTmp == frame && setNameTmp == setName && judgeInVariableNameTmp == judgeInVariableName)
{
if (dataTypeTmp == "double" || dataTypeTmp == "float")
{
phyDataDouble = DataOutWithId<double>(fin, dataSizeTmp, numCompTmp);
return phyDataDouble;
}
else if (dataTypeTmp == "int")
{
phyDataInt = DataOutWithId<int>(fin, dataSizeTmp, numCompTmp);
}
else if (dataTypeTmp == "double")
{
phyDataDouble = DataOutWithId<double>(fin, dataSizeTmp, numCompTmp);
}
else if (dataTypeTmp == "float")
{
phyDataFloat = DataOutWithId<float>(fin, dataSizeTmp, numCompTmp);
}
else
{
cout << "物理变量数据类型为不常见类型,请补充" << endl;
}
}
else
{
for (int i = 0; i < dataSizeTmp; i++)
{
getline(fin, line);
}
}
}
}
}
cout << "目前默认输出数据类型为double类型,读取变量数据类型是非double类型,无法输出";
return phyDataDouble;
}
主函数:
#include<vector>
#include<fstream>
#include <string>
#include <sstream>
#include<iostream>
using namespace std;
vector<vector<double>> Read_Set
(
int frame,
string partName,
string inVariableName,
int setType,
int partId
);
int main()
{
int frame = 1;
string setName = "FIX";
string inVariableName = "U";
int setType = 0;
int setId = 1;
vector<vector<double>>res =
Read_Set
(
frame,
setName,
inVariableName,
setType,
setId
);
return 0;
}
/*
文件名:1_displacement_FIX.txt
文件内容:
* 1 FIX point
displacement 10 3 double
1154 10.000000e+00 0.1000000e+00 0.0000001e+00
1258 20.000000e+00 0.2000000e+00 0.0000002e+00
1253 30.000000e+00 0.3000000e+00 0.0000003e+00
1514 40.000000e+00 0.4000000e+00 0.0000004e+00
1667 50.000000e+00 0.5000000e+00 0.0000005e+00
1466 60.000000e+00 0.6000000e+00 0.0000006e+00
1666 70.000000e+00 0.7000000e+00 0.0000007e+00
1252 80.000000e+00 0.8000000e+00 0.0000008e+00
1653 90.000000e+00 0.9000000e+00 0.0000009e+00
1462 100.000000e+00 1.000000e+00 0.0000010e+00
*/