gpt4 book ai didi

c++ - fscanf 符合条件

转载 作者:行者123 更新时间:2023-11-30 05:41:59 25 4
gpt4 key购买 nike

我的目标是读入一个每行仅包含一个数字的数据文件,并将数据写入直方图。 # 字符后面的文件中有一些注释。我想跳过这些行。

我已经开始写了:

TH1F *hist = new TH1F("hist","",4096, -0.5,4095.5);
//TF1 *fitfunc;

char filename[100];
double val;
int i;
char line[256];


sprintf(filename,"test.dat");
FILE* pfile = fopen(filename, "r");

for (i=0;i<=14;i++) {
fgets(line,256,pfile);
cout<<line<<endl;
fscanf(pfile, "%lf /n", &val);
hist->SetBinContent(i,val);
}

但只有每隔一行被写入“行”,而其他行则被 fscanfed。

如果有人能给我一个提示,那就太好了。

...所以这显然不能正常工作:

TH1F *hist = new TH1F("hist","",4096, -0.5,4095.5);
//TF1 *fitfunc;

char filename[100];
double val;
int i;
char zeile[256];

sprintf(filename,"test.dat");
FILE* pfile = fopen(filename, "r");

for (i=0;i<=14;i++)
{
fgets(zeile,256,pfile);
cout<<"fgets: "<<zeile<<endl;
if (zeile[0]!='#')
{
fscanf(pfile, "%lf /n", &val);
cout<<"val: "<<val<<endl;
hist->SetBinContent(i,val);
}
}

最佳答案

在阅读包含 fgets() 的行后,您需要使用 sscanf() 而不是 fscanf():

TH1F *hist = new TH1F("hist", "", 4096, -0.5, 4095.5);
char filename[100];
char zeile[256];

sprintf(filename, "test.dat");
FILE *pfile = fopen(filename, "r");
if (pfile == 0)
…handle error; do not continue…

for (int i = 0; i < 14 && fgets(zeile, sizeof(zeile), pfile) != 0; i++)
{
cout << "fgets: " << zeile << endl;
if (zeile[0] != '#')
{
double val;
if (sscanf(zeile, "%lf", &val) == 1)
{
cout << "val: " << val << endl;
hist->SetBinContent(i, val);
}
// else … optionally report that line was erroneous
}
}

我保留了文件名的 sprintf(),但它提供了边际值(value)。我很想使用 const char *filename = "test.dat"; 以便错误消息可以报告无法打开的文件名,而无需重复字符串文字。

转换成独立的测试程序:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
char filename[100];
char zeile[256];

sprintf(filename, "test.dat");
FILE *pfile = fopen(filename, "r");
if (pfile != 0)
{
for (int i = 0; i < 14 && fgets(zeile, sizeof(zeile), pfile) != 0; i++)
{
cout << "fgets: " << zeile;
if (zeile[0] != '#')
{
double val;
if (sscanf(zeile, "%lf", &val) == 1)
cout << "val: " << val << endl;
}
}
fclose(pfile);
}
return 0;
}

并给定一个测试数据文件 test.dat 包含:

1.234
2.345
#3.456
#4.567
5.678

显示的程序输出是:

fgets: 1.234
val: 1.234
fgets: 2.345
val: 2.345
fgets: #3.456
fgets: #4.567
fgets: 5.678
val: 5.678

这会生成三个预期的 val 行并读取但忽略两个注释行。

关于c++ - fscanf 符合条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com