C格式化i / o fscanf(新手)

时间:2015-05-12 16:03:27

标签: c scanf

我有一个包含一些数据的文件,一些标题行和一些数据标签。 我想提取数据并将其分配给变量。 我正在跳过两个标题行(未知长度):

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程序。 感谢。

2 个答案:

答案 0 :(得分:4)

(除了deepmax建议的更改):

您正在使用说明符%s,它会读取字符串直到第一个空格,即使您指定了长度(11)。你正在指定MAX长度,但如果它读取一个空格(“this”之后的那个),它仍然会提前纾困。

我会使用这种格式:

fscanf (filename, " %*[^=]=%f ", &x1);

这意味着:“扫描并丢弃所有字符,直到找到'='字符。然后扫描该字符。然后扫描浮点并将其写入x1。

答案 1 :(得分:3)

您必须将指针x1x2传递给fscanffscanf可以更改它们的值。

fscanf (filename, " %11s %f ", label, &x1);
fscanf (filename, " %11s %f ", label, &x2);

要捕获浮动,我有一个简单的解决方法:

char tmp[1000];
fscanf(filename, "%[^=]=%f", tmp, &x1);

我自己,不喜欢tmp这件事。它可以用更好的方式编写。