我对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();
}
有人有解决方案吗?还是指出我正确的方向?
提前致谢。
编辑:两个提议的解决方案(杰里和加利克斯)都运作良好。我喜欢这个社区。 :)
答案 0 :(得分:3)
这是(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
会成功。
答案 1 :(得分:0)
在处理您的广告时,您可以使用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
}
希望有所帮助
编辑:修正了错误(将pos添加4以跳过&#34; 500 /&#34;部分)