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

它看起来很常见而且很明显,但我已经在过去读过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); 

非常感谢您的帮助

你的程序中有几个错误 – 不匹配的大括号,未定义的变量等。然而,最重要的是,最可能导致你的问题的是,你没有在fscanf()调用中传递一个指向myvariable的指针。 你会想在那里使用&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  #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 
  fscanf(myfile,"%0.20f",myvariable); 

你必须传递一个指针,而不是使用&myvariable。 固定:

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

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

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

是的,这是*printf*scanf函数之间的不一致。 它的存在是因为*printf float参数被提升为double ; 指针没有这样的提升,例如你可能传递给fscanffloat*参数。

只需使用"%lf" ,而不是"%0.20lf" ; 我不确定后者是否有效。

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