首页 > 解决方案 > 调用函数时的问题,C++

问题描述

我需要帮助。

我编写了一个代码,目的是修改 .txt 中特定位置的值。我的第一个想法是将我所有的 .txt 存储在一个向量中,然后处理该向量。

为此我创建了2个功能:一个基本上是分割.txt的一行,另一个是在txt中找到好的行。找到后,通过调用第一个来分割行,然后我可以修改值对于想要的。

或多或少,您可以阅读以下我的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>

using namespace std;

vector<string> split(string myData) {
    vector<string> temporary;
    string delim = " ";
    string buf= "";
    int i = 0;
    while (i < myData.length()) {
        if (myData[i] != delim)
            buf += myData[i];
        else if (myData[i] == delim) {
            if (buf != ""){temporary.push_back(buf);}
            buf = "";
        } 
        i++;
    }
    return temporary;
}

void test (){
    fstream yourfile;
    string line, someString;
    vector<string> fichier;
    someString = "EnergySampler";
    ofstream monflux("/Users/geant4_simulation_20210413/results/myFile1MeV.txt");
    ifstream myFile("benchmark.txt");
    double number;
    
//////STORING THE .TXT IN VECTOR    
    
    if (myFile){
        while (getline(myFile,line)){
            fichier.push_back(line);
        } //end while
    } //end if
    else cerr << "Your file couldn't be opened";
     
////LOOKING FOR THE LINE AND MODIFY IT    

    for (int i(0); i<fichier.size(); i++) {
        size_t found = fichier[i].find(someString);
        if(found != string::npos){ // si existe
            //cout << fichier[i] << endl;
            vector<string> splitted ;
            splitted=split(fichier[i]);      // problem here...
            cout << splitted.size() <<endl;
            
            
            for (int k = 0; k < splitted.size(); k++){
                //number = strtod(splitted[k],&end);
                cout << splitted[i] << endl;
            }
            
            
        } //end if
    }
    
    myFile.close();
}

当我独立测试拆分函数时,它运行良好,它返回为向量中的每个字符串存储的行。

例如 :split("$ DOUBLE EnergySampler 0.019 $")

返回

(std::vector<std::string>) { "$", "DOUBLE", "EnergySampler", "0.019" }

到目前为止,一切都很好 !我只想选择“0.019”。

但是当在 test() 函数中调用函数时出现问题,我使用 : 得到的向量splitted=split(fichier[i]); 似乎只有 2 个值,而您可以在上面看到我的行包含 4 个。

那么我的问题是:为什么split()独立调用而不是从函数内部调用时有效?

谢谢你。

PS:我正在用 C++ 解释器 ROOT 编译我的函数。

标签: stringvectorsplit

解决方案


尽管代码看起来还不错,但我看到了两个错误。

  1. 我不确定这是否是故意的,但该split函数永远不会返回最后一个匹配项。在您的示例中,调用split("$ DOUBLE EnergySampler 0.019 $")将返回 vector ["$", "DOUBLE", "EnergySampler", "0.019"]"$"请注意向量末尾的缺失。因此,要解决此问题,您需要检查buf函数末尾是否不为空,如下所示(另外,看起来ROOT解释器接受与 比较charstring但我在修复中正确定义)delimchar

    vector<string> split(string myData) {
        vector<string> temporary;
        char delim = ' ';
        string buf= "";
        int i = 0;
        while (i < myData.length()) {
            if (myData[i] != delim)
                buf += myData[i];
            else if (myData[i] == delim) {
                if (buf != ""){temporary.push_back(buf);}
                buf = "";
            }
            i++;
        }
        if (buf != ""){temporary.push_back(buf);}
        return temporary;
    }
    
  2. 其次,当您迭代splitted向量时,您使用的是i索引变量(来自外部for)而不是k来自内部的索引变量for。如果我像下面这样修复它,它可以工作:

            for (int k = 0; k < splitted.size(); k++){
                //number = strtod(splitted[k],&end);
                cout << splitted[k] << endl;
            }
    

因此,为benchmark.txt以下内容运行它:

$ DOUBLE EnergySampler 0.019 $
$ DOUBLE Dummy 0.123 $
$ DOUBLE EnergySampler 0.018 $
$ DOUBLE Dummy 0.321 $
$ DOUBLE EnergySampler 0.017 $

它将输出以下内容:

5
$
DOUBLE
EnergySampler
0.019
$
5
$
DOUBLE
EnergySampler
0.018
$
5
$
DOUBLE
EnergySampler
0.017
$

推荐阅读