向函数传递字符串

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 文件并生成所有必要的向量。

以上是关于向函数传递字符串的主要内容,如果未能解决你的问题,请参考以下文章

向sql函数传递多个参数

cpp 线程传递参数

通过引用将字符串数组传递给 C 函数

从/向本机插件传递 wchar_t 字符串 - 仅适用于 Windows?

数组名作为函数的参数属于啥传递为啥

如何将字符串传递给函数并返回整数?