从文件中的一行读取特定数据-C++

Reading specific data from a line in a file - C++

本文关键字:读取 一行 -C++ 数据 文件      更新时间:2023-10-16

我有一个.txt文件,如下所示:

(P1, 3): (E10, E20, E1, E3)
(P2, 2): (E10, E20, E2,  E5)
(P3, 2): (E10, E20)

我只想保存数组中每行的数字。第一个应该是[1,3,10,0,1,3]。我该怎么做?

使用ifstream逐行遍历读取文件。

将字符串读取为std::字符串后,使用regex搜索来查找新读取的字符串中数字的出现次数。

要用于提取字符串中所有数字的正则表达式如下:

https://regex101.com/r/yWJp5p/3

使用示例:

#include <regex>
#include <iostream>
#include <string>
std::vector<std::string> fetchMatches(std::string str, const std::regex re) {
std::vector<std::string> matches;
std::smatch sm; // Use to get the matches as string
while (regex_search(str, sm, re)) {
matches.push_back(sm.str());
str = sm.suffix();
}
return matches;
}
int main() {
std::string example_input = "(P1, 3): (E10, E20, E1, E3)";
std::regex re{"\d+"};
auto matches = fetchMatches(example_input, re);
for (const auto& match : matches) {
std::cout << match << std::endl;
}
return 0;
}

有多种解决方案。解释其中一个解决方案。

利用C.的isDigit和strtol函数

char *str = "(P1, 3): (E10, E20, E1, E3)", *p = str;
while (*p) {
if ( isdigit(*p)) {
long val = strtol(p, &p, 10); 
printf("%ldn", val);
} else {
p++;
}
}

注意:如果文件中有负数,则需要进行检查。

只需在if条件中添加((*p=='-'||*p=='+') && isdigit(*(p+1)))即可。