如何从也包含C++字母的文本文件中提取某些数字?

How to extract certain numbers from a text file that also contains letters in C++?

本文关键字:提取 文件 数字 文本 包含 C++      更新时间:2023-10-16

我正在尝试弄清楚如何从文本文件中提取值作为双精度类型,以便它们可以用于计算。

我有一个格式如下的文本文件:

parameter1        parameter2         parameter3
50                0                  0.1

我只想提取数字。 这是我的尝试之一(我已经工作了几个小时,试图弄清楚如何做到这一点(。

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
const int MAX = 80;
char buffer[MAX];
string input;
double j;
ifstream param0;
param0.open("param0.txt");
char ch;
while (param0)
{
param0.get(ch);
cout << ch;
}
getline(param0, input);
param0 >> j;
while (param0)
{
cout << j << endl;
getline(param0, input);
param0 >> j;
}

return 0;
}

此代码

char ch;
while (param0)
{
param0.get(ch);
cout << ch;
}

运行到文件末尾。之后的所有读取都不会返回任何内容。要么取消此循环,要么将文件倒带param0.rewind()

代码的基本思想应该是:

std::string line;
double p1, p2, p3;
std::string more;
while (std::getline(in, line)) {
std::istringstream iss{line};
if (iss >> p1 >> p2 >> p3 && !(iss >> more)) {
std::printf("p1=%f, p2=%f, p3=%fn", p1, p2, p3);
} else {
std::printf("invalid line: %sn", line.c_str());
}
}

简而言之,代码说:如果一行包含三个数字并且仅此而已,则该行是有效的。

C++纯粹主义者会说我不应该在C++中使用 printf,但我喜欢格式化和实际数据之间的分离。

建议:

  • 最好检查是否正确打开文件。
  • 完成后关闭文件。

如果您在一行中读取所有内容,则可以使用>> 运算符。只要传递正确的存储变量,它的字符串或双精度都无关紧要;

string param1;
string param2;
string param3;
double j,k,l;
ifstream file("test.txt",std::ios::in);
if (!file.is_open())
std::cout << "failed to open " << endl;
while (file)
{
file >> param1 >> param2 >>param3; // getting as strings
cout << param1 <<", "<< param2<<", "<< param3<<endl; 
file >> j >> k >> l;               //getting as doubles
cout << j <<", " << k <<", "  << l<<endl;
}
file.close();
return 0;

输出

参数 1, 参数 2, 参数 3
50, 0, 0.1