我的.txt
文件里面有这样的文字(这只是一个片段):
...
[332, 605]-[332, 592], srednica: 13
[324, 593]-[332, 605], srednica: 14.4222
[323, 594]-[332, 605], srednica: 14.2127
[323, 594]-[331, 606], srednica: 14.4222
[324, 593]-[324, 607], srednica: 14
[323, 594]-[323, 607], srednica: 13
[319, 596]-[319, 607], srednica: 11
[320, 595]-[320, 607], srednica: 12
...
我需要的是从每一行获得前4个数字并将它们存储为整数。
我试过这样的事情:
ifstream file("punkty_srednice.txt");
string line;
int ax, ay, bx, by;
while(getline(file, line)) {
stringstream s(line);
string tmp;
s >> tmp >> ax >> tmp >> ay >> tmp >> bx >> tmp >> by >> tmp;
cout << ax << " " << ay << " " << bx << " " << by << endl;
}
输出(只是其中的一部分):
...
506 506 -858993460 -858993460
503 503 -858993460 -858993460
495 503 -858993460 -858993460
497 503 -858993460 -858993460
500 497 -858993460 -858993460
492 503 -858993460 -858993460
...
正如你所见,有一些奇怪的数字,如-858993460
我做了其他尝试,删除tmp
并直接这样:
s >> ax >> ay >> bx >> by;
但是输出只包含像-858993460
我该如何处理?
答案 0 :(得分:1)
您可以使用std::getline
和','
作为分隔符来获取第一部分和数字。然后用空格替换所有非数字字符(参见例如std::transform
)。然后将结果字符串放在std::istringstream
中,并从中读取四个数字。
关于代码有什么问题的一些提示,主要归结为当与字符串一起使用时,输入操作符>>
读取空格分隔的字符串。
所以对于这行
[332, 605]-[332, 592], srednica: 13
您的输入将是
tmp
会有"[332,"
ax
它将放置605
tmp
会有"]-[332,"
ay
会有592
tmp
会有"],"
bx
它将尝试来读取不是有效数字的字符串"srednica"
,输入将失败并设置fail
标志输入流,使所有以下输入无效如何使用std::transform
将字符串中的任何非数字字符替换为空格:
std::string s = "[332, 605]-[332, 592]";
std::cout << "Before: \"" << s << "\"\n";
std::transform(std::begin(s), std::end(s), std::begin(s),
[](const char& ch) -> char
{
return (std::isdigit(ch) ? ch : ' ');
});
std::cout << "After : \"" << s << "\"\n";
上面的代码打印
Before: "[332, 605]-[332, 592]" After : " 332 605 332 592 "