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

C formatting i/o fscanf (Novice)

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

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

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

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

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

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

我自己,不喜欢那个 tmp 东西。可以写得更好

(除了 deepmax 建议的更改):

您正在使用说明符 %s,它读取字符串直到第一个白色 space,即使您指定了长度 (11)。您正在指定最大长度,但如果它读取 space("this" 之后的那个),它仍会提前退出。

我会使用这种格式:

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

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