【问题标题】:Reading multiple data from string, separated by characters using sstream从字符串中读取多个数据,使用 sstream 以字符分隔
【发布时间】:2014-07-25 11:02:12
【问题描述】:

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

我该如何应对?

【问题讨论】:

    标签: c++ ifstream sstream


    【解决方案1】:

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


    关于代码有什么问题的一些提示,主要归结为与字符串一起使用时,输入运算符 &gt;&gt; 读取 空格分隔 字符串。

    所以对于这条线

    [332, 605]-[332, 592],斯雷德尼察: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";
    

    上面的代码打印出来

    之前:“[332, 605]-[332, 592]” 之后:“332 605 332 592”

    【讨论】:

    • 你完全正确!现在我意识到为什么我得到 2 个好的价值和 2 个垃圾。我找不到 std::transform 的好例子,所以我一步一步替换'[' ']' '-' ','
    • @user3804906 按照我的答案中的链接。 :)
    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2018-02-27
    • 2011-12-26
    相关资源
    最近更新 更多