读取包含float的C中的.txt文本文件,用空格分隔

时间:2011-08-22 18:34:53

标签: c text

它看起来很常见而且显而易见但我已经在过去读过C中的txt文件,而且我真的卡住了。

我有一个这种格式的txt文件

0.00000587898458 0.0014451541000 0.000000000001245
0.00012454712235 0.1245465756945 0.012454712115140

...有640列和480行。

我希望将每个txt文件的数量放在一个浮点数中,尽可能保持最大精度,并在for循环中。

FILE* myfile=NULL;
double myvariable=0.0;
myfile=fopen("myfile.txt","r");

for(i =0, k=0 ; i< height; i++)
    for (j=0 ; j< width ; j++){
fscanf(myfile,"%0.20f",&myvariable);
printf("%0.20f",myvariable);
k++;
}
}
fclose(myfile);

非常感谢您的帮助

4 个答案:

答案 0 :(得分:8)

你的程序中有几个错误 - 不匹配的大括号,未定义的变量等。然而,最重要的是,最可能导致你的问题的是,你没有将指针传递给{{1}在myvariable电话中。您需要在fscanf()使用&myvariable,以便fscanf()能够恰当地填写它。你可能不需要格式字符串这么复杂 - "%lf"应该可以很好地读取double。实际上,gcc使用您的格式字符串警告我:

example.c:16: warning: zero width in scanf format
example.c:16: warning: unknown conversion type character ‘.’ in format

然后我的输出变为0.尝试"%lf"。以下是您的示例输入的完整工作示例:

#include <stdio.h>

#define HEIGHT 2
#define WIDTH  3

int main(void)
{
  FILE *myfile;
  double myvariable;
  int i;
  int j;

  myfile=fopen("myfile.txt", "r");

  for(i = 0; i < HEIGHT; i++)
  {
    for (j = 0 ; j < WIDTH; j++)
    {
      fscanf(myfile,"%lf",&myvariable);
      printf("%.15f ",myvariable);
    }
    printf("\n");
  }

  fclose(myfile);
}

示例运行:

$ ./example 
0.000005878984580 0.001445154100000 0.000000000001245 
0.000124547122350 0.124546575694500 0.012454712115140 

答案 1 :(得分:3)

 fscanf(myfile,"%0.20f",myvariable);

你必须传递一个指针,而不是使用&amp; myvariable。修正:

 fscanf(myfile, "%lf", &myvariable);

答案 2 :(得分:2)

我只能猜测,因为您没有向我们展示您的实际源代码,但是......

fscanf的{​​{1}}格式需要指向"%f"的指针;你给它一个指向float的指针。这可能是导致您遇到问题的原因。使用double代表"%lf"(或double代表"%Lf")。

是的,这是long double*printf函数之间的不一致。它的存在是因为*scanf的{​​{1}}个参数被提升为float;没有针对指针的促销,例如您可能传递给*printf的{​​{1}}参数。

只使用double,而不是float*;我不确定后者是否有效。

答案 3 :(得分:0)

  1. 你说你被困了,但是没有详细说明你遇到的问题究竟是什么。
  2. 您最有可能打算将'myvariable'的地址传递给fscanf。
  3. 即使你不太关心精确度(在你的情况下,你明确地说你做过tjat),你应该更喜欢双重浮动。你应该选择浮动只有当你有一个非常强烈的理由选择浮动超过双倍时,甚至应该在非常特殊的情况下。
  4. 始终检查fopen的来电以确保成功。