我有一个包含一些数据的文件,一些标题行和一些数据标签。 我想提取数据并将其分配给变量。 我正在跳过两个标题行(未知长度):
char buffer[100];
fgets(buffer, 100, cp);
fgets(buffer, 100, cp);
数据上的标签读起来像
this datum =0.444
this other =6.666
实际数据始终从第12列开始。 我正在通过连续的fscanf调用来阅读这些行
float x1;
float x2;
char label[11];
fscanf (filename, " %11s %f ", label, x1);
fscanf (filename, " %11s %f ", label, x2);
等
这不起作用。我的所有价值都是零。
我也得到关于'%f'的编译警告,期望类型为'float *'的参数,但参数4的类型为'double'。
我知道如何在FORTRAN中执行此操作,但之前从未编写过C程序。 感谢。
答案 0 :(得分:4)
(除了deepmax建议的更改):
您正在使用说明符%s
,它会读取字符串直到第一个空格,即使您指定了长度(11)。你正在指定MAX长度,但如果它读取一个空格(“this”之后的那个),它仍然会提前纾困。
我会使用这种格式:
fscanf (filename, " %*[^=]=%f ", &x1);
这意味着:“扫描并丢弃所有字符,直到找到'='
字符。然后扫描该字符。然后扫描浮点并将其写入x1。
答案 1 :(得分:3)
您必须将指针x1
和x2
传递给fscanf
。 fscanf
可以更改它们的值。
fscanf (filename, " %11s %f ", label, &x1);
fscanf (filename, " %11s %f ", label, &x2);
要捕获浮动,我有一个简单的解决方法:
char tmp[1000];
fscanf(filename, "%[^=]=%f", tmp, &x1);
我自己,不喜欢tmp
这件事。它可以用更好的方式编写。