使用string :: find来解析文件

时间:2014-03-02 18:59:10

标签: c++

我有一个用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;
} 

有人可以给我一个提示或链接到一个涵盖这个的好教程吗?

4 个答案:

答案 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对象,可以迭代。

参考:http://www.cplusplus.com/reference/regex/

另见:Retrieving a regex search in C++

答案 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;
}