string - 调用函数时的问题,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 编译我的函数。
解决方案
尽管代码看起来还不错,但我看到了两个错误。
我不确定这是否是故意的,但该
split
函数永远不会返回最后一个匹配项。在您的示例中,调用split("$ DOUBLE EnergySampler 0.019 $")
将返回 vector["$", "DOUBLE", "EnergySampler", "0.019"]
。"$"
请注意向量末尾的缺失。因此,要解决此问题,您需要检查buf
函数末尾是否不为空,如下所示(另外,看起来ROOT
解释器接受与 比较char
,string
但我在修复中正确定义)delim
:char
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; }
其次,当您迭代
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
$
推荐阅读
- java - 如何使用 JAVA 过滤器 lambda 对 Arraylist 元素进行分组
- sql - SQL Server:查找不同表中两个参数之间的重复项
- spring-boot - log4j2.xml fluentd 错误,当 servlet 抛出 ex 日志被破坏时(转储错误事件:error_class=Fluent::Plugin::Parser::ParserError)
- python - ImportError:无法从烧瓶中的“flask_sqlalchemy”错误导入名称“SQLALchemy”
- java - 为什么 Maven 生成具有 5 个参数而不是 wsdl 参数的方法?
- pandas - 用于基因组学的 Python 中的嵌套结构和大数据处理(Dask.Bags vs PySpark vs 替代方案?)
- java - 在 domain.com/robots.txt 中显示 robots.txt 文件,而不是在 Spring Java Web 应用程序中的 domain.com/context/robots.txt
- javafx - fxml 文件中的更改不可见
- reactjs - 如何使用反冲为自定义钩子编写测试代码
- c# - 根据用户语言将嵌套的 JSON 数据渲染到剃须刀页面(asp.net 核心剃须刀页面)