逐行读取不同的行长度

时间:2016-07-08 11:36:31

标签: c++ string int extract

我有这个文本文件,每行代表一个多边形的顶点。

(-189, 102), (-62, 113), (-40, 56), (-105, -11)
(-692, 403), (-669, 308), (-572, 273)
(-750, 480), (750, 480), (750, -480), (-750, -480) 
(57, -218), (47, -270), (134, -366), (235, -366), (300, -260), (335, -182)

如何读取每个顶点x和y并将它们存储到int变量中。请注意,每一行都可以有不同数量的对。我想逐行进行,所以我知道文件中新的多边形何时开始。

我正在尝试这一点来获取每一行但是我该如何从行中提取整数?

int main() {
    string line;
    ifstream myfile("input.txt");
    if (myfile.is_open())
    {
        while (getline(myfile, line))
        {
            //cout << line << '\n';
            stringstream stream(line);

        }
        myfile.close();
    }

    else cout << "Unable to open file";

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您正确地获得了line。您只需要建立一个容器(我将使用vector<vector<pair<int,int>> foo。)然后您可以使用regex_iterator为您提取信息。我会用这样的东西:

\s*,?\s*\(\s*([-0-9]+)\s*,\s*([-0-9]+)\s*\)

Live Example

然后,一旦你得到line,你可以使用你的正则表达式:

regex re(R"~(\s*,?\s*\(\s*([-0-9]+)\s*,\s*([-0-9]+)\s*\))~");
vector<pair<int, int>> temp;

transform(sregex_iterator(cbegin(line), cend(line), re), sregex_iterator(), back_inserter(temp), [](const auto& it) { return make_pair(stoi(it[1]), stoi(it[2])); });
foo.push_back(temp);

Live Example

修改

如果您选择了最简单的分隔方案,使用空格和换行来分隔输入,则可以避免使用正则表达式。这可能是合乎需要的,但您不会看到任何性能变化,因为几乎任何方法都可以用文件IO费用注销。尽管如此,如果你得到了输入:

  

-189 102 -62 113 -40 56 -105 -11
  -692 403 -669 308 -572 273
  -750 480 750 480 750 -480 -750 -480
  57 -218 47 -270 134 -366 235 -366 300 -260 335 -182

一旦你再次得到line,你可以做到:

istringstream stream(line);
vector<pair<int, int>> temp;

for(pair<int, int> i; stream >> i.first >> i.second;) temp.push_back(i);
foo.push_back(temp);

Live Example