#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
*/