【问题标题】:How to extract certain numbers from a text file that also contains letters in C++?如何从包含 C++ 字母的文本文件中提取某些数字?
【发布时间】:2018-10-15 23:00:27
【问题描述】:

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

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

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

【问题讨论】:

  • 您的第一个循环读取到文件末尾并简单地显示数据。为什么要这么做。取消该循环,或关闭并重新打开文件。
  • 您可以在显示文件后倒回文件,但最好按分配的方式打印。
  • 你为什么同时使用param0 &gt;&gt; j和getline。您只需要一个或另一个,具体取决于您是要读取整行还是只读取一个值。

标签: c++ fstream getline


【解决方案1】:

这段代码

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

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

【讨论】:

    【解决方案2】:

    代码的基本思路应该是:

    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,但我喜欢格式和实际数据之间的分离。

    【讨论】:

      【解决方案3】:

      建议:

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

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

      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

      【讨论】:

      • 这段代码中的假设是有一个标题行和一个数据行
      • @pm100 。这是正确的。问题似乎是如何从文本文件中读取双打。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2022-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多