C格式化i/o fscanf(新手)
我有一个文件,其中包含一些数据、一些标题行和一些数据标签。 我想提取数据并将其分配给变量。 我正在跳过两个标题行(长度未知),包括: 数据上的标签读起来像C格式化i/o fscanf(新手),c,scanf,C,Scanf,我有一个文件,其中包含一些数据、一些标题行和一些数据标签。 我想提取数据并将其分配给变量。 我正在跳过两个标题行(长度未知),包括: 数据上的标签读起来像 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, " %
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
,它读取字符串直到第一个空格,即使您指定了长度(11)。您正在指定MAX length,但如果它读取一个空格(“this”后面的空格),它仍然会提前退出
我将使用以下格式:
fscanf (filename, " %*[^=]=%f ", &x1);
这意味着:“扫描并丢弃所有字符,直到找到
”='
字符。然后扫描该字符。然后扫描一个浮点并将其写入x1。谢谢!这消除了编译错误,但数据没有正确读入(仍然为零)是的,*
丢弃。比我的解决方案更好。+1这很有效。我现在也可以删除标签的任何引用。
fscanf (filename, " %*[^=]=%f ", &x1);