gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:46:11 25 4
gpt4 key购买 nike

我有一个 .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], srednica: 13

your input will be

  1. into tmp it will put "[332,"
  2. into ax it will put the 605
  3. into tmp it will put "]-[332,"
  4. into ay it will put 592
  5. into tmp it will put "],"
  6. into bx it will try to read the string "srednica" which is not a valid number, and the input will fail and set the fail flag on the input stream, making all the following inputs invalid

How to replace any non-digit character in a string to a space using 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 "

关于c++ - 从字符串中读取多个数据,使用 sstream 以字符分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24954270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com