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

时间:2018-10-15 23:00:28

标签: c++ fstream getline

我试图弄清楚如何从文本文件中提取值作为double类型,以便可以在计算中使用它们。

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

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

3 个答案:

答案 0 :(得分:0)

此代码

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

运行到文件末尾。读取之后的所有读取将不返回任何内容。退出此循环或倒退文件param0.rewind()

答案 1 :(得分:0)

代码的基本思想应为:

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=%f\n", p1, p2, p3);
    } else {
        std::printf("invalid line: %s\n", line.c_str());
    }
}

用简单的话来说,代码说:如果一行包含三个数字并且仅此一行,则该行有效。

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

答案 2 :(得分:0)

建议:

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

如果您一行阅读所有内容,则只需使用>>运算符即可。不管它的字符串是字符串还是字符串的两倍,只要传递正确的存储变量都没有关系;

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

相关问题