[英]Save next word, if a given word is found (C++)
我是C ++的新手。 我有一个看起来像这样的文本文档:
InputFile.txt
...
.
..
.
.
....
TIME/DISTANCE = 500/ 0.1500E+05
..
..
.
...
TIME/DISTANCE = 500/ 1.5400E+02
.
...
...
.
TIME/DISTANCE = 500/ 320.0565
..
..
.
.
...
显示的一行在整个文件中不断重复。 我的目标是将500/
之后的所有数字保存到数组/向量/另一个文件/任何内容中。 我知道如何读取文件并获取一行:
string line;
vector <string> v1;
ifstream txtfile ("InputFile.txt");
if (txtfile.is_open())
{
while (txtfile.good())
{
while( getline( txtfile, line ) )
{
// ?????
// if(line.find("500/") != string::npos)
// ?????
}
}
txtfile.close();
}
有人有解决方案吗? 还是指出我正确的方向?
提前致谢。
编辑:两个提议的解决方案(杰里和加利克)都完美地运作。 我喜欢这个社区。 :)
这是(IMO)在C ++中使用sscanf
可能有意义的极少数情况之一。
std::string line;
std::vector<double> numbers;
while (std::getline(txtfile, line)) {
double d;
if (1==sscanf(line.c_str(), " TIME/DISTANCE = 500 / %lf", &d))
numbers.push_back(d);
}
这会占用每一行,并尝试将其视为具有您关注的格式。 如果成功, sscanf
的返回值将为1(转换的项目数)。 如果失败,返回值将为0(即,它没有成功转换任何内容)。 然后我们保存它,如果(并且只有)成功转换。
另请注意, sscanf
足够“智能”,可以将格式字符串中的单个空格视为与输入中任意数量的空白区域相匹配,因此我们不必尝试精确匹配空白区域。
我们可以稍微改变一下。 如果在'/'之前必须有一个数字,但它可能与500
不同,我们可以用%*d
替换格式字符串的那部分。 这意味着sscanf
将在那里搜索一个数字(特别是整数),但不会将其分配给任何东西。 如果它找到的不是整数,转换将失败,因此(例如) TIME/DISTANCE ABC/1.234
将失败,但TIME/DISTANCE 234/1.l234
将成功。
在处理您的行时,您可以使用line.find()
检查其右侧行并查找您的数据:
if(line.find("TIME/DISTANCE") != std::string::npos)
{
// this is the correct line
}
获得正确的行后,您可以获得数据的位置,如下所示:
std::string::size_type pos = line.find("500/");
if(pos != std::string::npos)
{
// pos holds the position of the numbers you want
std::string wanted_numbers = lint.substr(pos + 4); // get only the numbers in a string
}
希望有所帮助
编辑:修正了错误(添加4到pos跳过“500 /”部分)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.