我有这个文本文件,每行代表一个多边形的顶点。
(-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;
}
答案 0 :(得分:1)
您正确地获得了line
。您只需要建立一个容器(我将使用vector<vector<pair<int,int>> foo
。)然后您可以使用regex_iterator
为您提取信息。我会用这样的东西:
\s*,?\s*\(\s*([-0-9]+)\s*,\s*([-0-9]+)\s*\)
然后,一旦你得到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);
修改强>
如果您选择了最简单的分隔方案,使用空格和换行来分隔输入,则可以避免使用正则表达式。这可能是合乎需要的,但您不会看到任何性能变化,因为几乎任何方法都可以用文件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);