我一整天都在苦苦思索,认为是时候寻求帮助了。数据文件如下
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 ++进行字符处理,因此如果代码不完全有效,代码必须要求改进。如果能以专业的方式重写它,我将非常感激。
答案 0 :(得分:4)
由于你在c++,你不应该使用纯char数组,因为它们更容易出错并且很难维护std::string
。此外,c文件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;
}