向函数传递字符串
Posted
技术标签:
【中文标题】向函数传递字符串【英文标题】:Passing a function a string 【发布时间】:2017-04-29 01:32:35 【问题描述】:我目前有一个程序,它从 dat 文件中获取数据并形成一个二维向量。现在,我有 10 个 dat 文件和 10 个不同的函数,每个函数都创建一个向量。我想知道如何缩短代码并创建一个函数,通过传递带有 dat 文件名称的字符串来创建二维向量。下面我列出了几个函数。
vector<vector<double> > Cosmic_ray_events()
const double columns = 8.;
ifstream cosmic_ray_data("events_comp-h4a_10.00-10000.00PeV_zen37.00.dat", ios::in);
vector< vector<double> > cosmic_ray;
while(cosmic_ray_data.good())
vector <double> row_vector;
for(int i = 0; i < columns; i++)
double data;
cosmic_ray_data >> data;
row_vector.push_back(data);
cosmic_ray.push_back(row_vector);
//cout << cosmic_ray[i][data];
cosmic_ray_data.close();
for(double k = 0; k < cosmic_ray.size(); k++)
for (double z = 0; z < cosmic_ray[k].size(); z++)
cout << cosmic_ray[k][z] << " " << endl;
return(cosmic_ray);
vector<vector<double> > IC40_events()
const double columns = 8.;
ifstream IC40_events_data("IC40_exp.dat", ios::in);
vector< vector<double> > IC40;
while(IC40_events_data.good())
vector <double> row_vector1;
for (int j = 0; j < columns; j++)
double IC40_data;
IC40_events_data >> IC40_data;
row_vector1.push_back(IC40_data);
IC40.push_back(row_vector1);
IC40_events_data.close();
return(IC40);
代码在这里
【问题讨论】:
【参考方案1】:基本上你这样做
std::vector<std::vector<double> > readDAT(std::string const &path)
std::vector<std::vector<double> > data;
const int columns = 8; // pass as a parameter?
ifstream instream(path, ios::in);
while( data_good(instream) ) // you don't provide cosmic_data_good
std::vector<double> line;
for(int i= 0; i < columns; i++)
double datum;
instream >> datum;
line.push_back(datum);
data.push_back(line);
return data;
这些文件由 8 个实数列组成。所以他们都可以用相同的程序来阅读。如果列数不同,您可以将其传入并使列成为变量而不是常量,这只是一个小改动。您还需要某种检测数据结束的方法,我想 data_good() 函数会这样做。
另一个技巧是获取打开的 istream,并在包装函数中打开文件。然后,您可以从任何来源加载 .DAT 数据,而不仅仅是磁盘文件。
这样称呼
vector<vector<double> > cosmic_ray = readDAT("events_comp-h4a_10.00-10000.00PeV_zen37.00.dat");
vector<vector<double> > IC40_events = readDAT("IC40_exp.dat");
等等,对于您的所有数据集。
【讨论】:
如何检查它是否会读取并创建所有必要的二维向量? 这就是你的 is_good() 函数。假设您发布的代码是正确的,它会在数据用完时返回 false。 (使用 C 接口进行流处理要容易得多,但这是另一个话题)。 谢谢,我仍然无法理解这段代码将如何调用 10 个不同的 dat 文件并生成所有必要的向量。以上是关于向函数传递字符串的主要内容,如果未能解决你的问题,请参考以下文章