繁体   English   中英

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

[英]Reading multiple data from string, separated by characters using sstream

我有.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::istringstreamstd::istringstream读取四个数字。


有关代码问题的一些技巧,主要归结为与字符串一起使用时,输入运算符>>读取以空格分隔的字符串。

所以对于线

[332, 605]-[332, 592], srednica: 13

您的输入将是

  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";

上面的代码打印

Before: "[332, 605]-[332, 592]"
After : " 332  605   332  592 "

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM