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 程序。
谢谢
您必须将指向 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
东西。可以写得更好
(除了 deepmax 建议的更改):
您正在使用说明符 %s
,它读取字符串直到第一个白色 space,即使您指定了长度 (11)。您正在指定最大长度,但如果它读取 space("this" 之后的那个),它仍会提前退出。
我会使用这种格式:
fscanf (filename, " %*[^=]=%f ", &x1);
这意味着:“扫描并丢弃所有字符,直到找到 '='
字符。然后扫描该字符。然后扫描一个浮点数并将其写入 x1。
我有一个文件,其中包含一些数据、一些 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 程序。 谢谢
您必须将指向 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
东西。可以写得更好
(除了 deepmax 建议的更改):
您正在使用说明符 %s
,它读取字符串直到第一个白色 space,即使您指定了长度 (11)。您正在指定最大长度,但如果它读取 space("this" 之后的那个),它仍会提前退出。
我会使用这种格式:
fscanf (filename, " %*[^=]=%f ", &x1);
这意味着:“扫描并丢弃所有字符,直到找到 '='
字符。然后扫描该字符。然后扫描一个浮点数并将其写入 x1。