如何读取具有不确定条目的行到数值数组?

时间:2017-08-28 21:20:52

标签: c++ arrays

我一整天都在苦苦思索,认为是时候寻求帮助了。数据文件如下

num - eFERMI:
    -0.062062        0.061938       -0.000220       -0.064446        0.064839

我需要用eFERMI识别这一行,然后在下一行中读入一个数字数组,当读入数据时需要确定这些数据。

我提出的代码类似于以下

 #include <fstream>
 #include <string.h>
 #include <iostream>
 #include <stdlib.h>
 #include <math.h>

 using namespace std;

 int main(){

   int nx=5;
   double *dE_fdx=new double [nx];

   FILE *f1;
   char buf[1000];  string sbuf;
   char* pch,*rsr;

   f1=fopen("deriv_num.dat","r");

   // try find out the line with eFERMI
   do{ fgets(buf,1000,f1); sbuf=string(buf); }while(sbuf.find("eFERMI")==std::string::npos);

   // if successfully found, then read in the coming line
   if(sbuf.find("eFERMI")!=std::string::npos){
     fgets(buf,1000,f1);  rsr=buf;
     int i=0;
     while((pch=strtok_r(rsr," ",&rsr))){
       if(i>=nx){ cout << "i>=nx\n"; exit(1);}
       dE_fdx[i++]=atof(pch);
     }
   }
   else
     exit(1);

   fclose(f1);

 }

执行似乎将尾随的空格变为零,这不是我所期望的,我不知道如何摆脱字符指针的尾随空格。另外,我不熟悉使用c / c ++进行字符处理,因此如果代码不完全有效,代码必须要求改进。如果能以专业的方式重写它,我将非常感激。

1 个答案:

答案 0 :(得分:4)

由于你在,你不应该使用纯char数组,因为它们更容易出错并且很难维护std::string。此外,文件API已替换为fstream

以下是使用

在C ++中完成的示例

输出: -0.062062 0.061938 -0.00022 -0.064446 0.064839

#include <fstream>
#include <vector>
#include <sstream>
#include <iostream>

int main()
{
    std::ifstream f("deriv_num.dat");
    std::string line;
    std::vector<double> nums;
    double temp;

    while (std::getline(f, line))
    {
        if (line.find("eFERMI") != std::string::npos)
        {
            std::getline(f, line);
            std::stringstream ss(line);
            while (ss >> temp)
            {
                nums.push_back(temp);
            }
        }
    }

    for (double& it : nums)
    {
        std::cout << it << " ";
    }
    std::cout << std::endl;

    f.close();
    return 0;
}