我有一个用std :: ifstream打开的文件。我有一行代码需要解析:
<image source="tileset/grass-tiles-2-small.png" width="384" height="192"/>
让我说我对在宽度=“
之后找到的”384“感兴趣我不知道如何从该行中提取“384”,因为数字384根本不是常数。
void parseFile(const std::string &mfName)
{
std::ifstream file(mfName);
std::string line;
if (file.is_open())
{
while (getline(file, line))
{
std::size_t found = line.find("width");
if (found != std::string::npos)
{
std::cout << found << std::endl;
}
}
}
else
std::cerr << "file failed to open" << std::endl;
}
有人可以给我一个提示或链接到一个涵盖这个的好教程吗?
答案 0 :(得分:1)
这是你的档案:
<image source="tileset/grass-tiles-2-small.png" width="384" height="192"/>
既然你感兴趣的只是width
,我们应该首先得到整行:
if (std::getline(file, line))
{
现在我们需要找到width
。我们使用find()
方法执行此操作:
std::size_t pos = line.find("width");
find()
内的字符串是我们想要查找的值。
一旦我们检查它是否找到了这个位置:
if (pos != std::string::npos)
{
我们需要将其放入std::stringstream
并解析数据:
std::istringstream iss(line.substr(pos));
substr()
调用用于选择字符串的子序列。 pos
是我们找到"width"
的位置。到目前为止,这是stringstream中的内容:
width="384" height="192"/>
由于我们实际上并不关心"width"
,而是关注引号内的数字,因此我们必须ignore()
引号前的所有内容。这是这样做的:
iss.ignore(std::numeric_limits<std::streamsize>::max(), '"');
现在我们使用提取器来提取整数:
int width;
if (iss >> width)
{
std::cout << "The width is " << width << std::endl;
}
我希望这会有所帮助。以下是该计划的完整示例:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
void parseFile(const std::string& mfName)
{
std::ifstream file(mfName);
std::string line;
if (std::getline(file, line))
{
auto pos = line.find("width");
if (pos != std::string::npos)
{
std::istringstream iss(line.substr(pos));
int width;
if (iss.ignore(std::numeric_limits<std::streamsize>::max(), '"') &&
iss >> width)
{
std::cout << "The width is " << width << std::endl;
}
}
}
}
答案 1 :(得分:0)
使用正则表达式解析器解析字符串。在进行C ++时,请包含<regex>
标头,并使用函数regex_search
来匹配结果。结果进入smatch
对象,可以迭代。
答案 2 :(得分:0)
如果我是你,我会使用XML库(如果这实际上是XML)。这是你当然不想重新发明但重用的事情之一! :)
过去,我已成功将TinyXML用于较小的项目。或谷歌“c ++ xml库”替代。
答案 3 :(得分:0)
使用Boost-Regex
,您可以在函数中使用以下内容
/* std::string line = "<image source= \
\"tileset/grass-tiles-2-small.png\" width=\"384\" height=\"192\"/>";
*/
boost::regex expr ("width=\"(\\d+)\"");
boost::smatch matches;
if (boost::regex_search(line, matches, expr))
{
std::cout << "match: " << matches[1] << std::endl;
}