从字符串中读取多个数据,使用sstream以字符分隔

Reading multiple data from string, separated by characters using sstream

本文关键字:sstream 使用 字符 分隔 数据 字符串 读取      更新时间:2023-10-16

我有一个.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

我该怎么处理呢?

您可以使用std::getline','作为分隔符来获得带有数字的第一部分。然后用空格替换所有非数字字符(参见示例std::transform)。然后将结果字符串放入std::istringstream并从中读取四个数字。


关于代码错误的一些提示,它主要归结为当与字符串一起使用时,输入操作符>>读取以空格分隔的字符串。

对于

这一行<>之前[332,605]-[332,592]之前

你的输入将是

  1. 放到tmp中,它会把"[332,"放到
  2. 放到ax中它会把605放到
  3. 放到tmp中,它会把"]-[332,"放到
  4. 放到ay中,它会把592放到
  5. 放到tmp中,它会把"],"放到
  6. 进入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";
以上代码输出 <>之前以前:"[332,605]-[332,592]"后:"332 605 332 592"