2015-06-02 90 views
0

我有一个输入文件,每行包含六个双打,我希望通过fscanf读取它。但是,从输入文件读取数字后,所有存储的值都为零。例如:用fscanf读取多行双打

输入:

8.260358155 0.217414463 0.079918794 -0.068255156 -0.124913458 0.821136998 
0.095921056 0.878265878 1.099486349 0.766342809 1.918243674 0.476907831 
1.050441605 8.451442631 0.945819695 -0.440024089 -1.149013541 0.374284191 

代码:

double r[NMAX][3]; 
    double rv[NMAX][3]; 
    int nAtom = 3; 
    int n; 
    FILE *loadFile = fopen(LoadName,"r"); 
    if (loadFile == NULL){ 
     printf("ERROR: can't open loadFile\n"); 
     exit(1); 
    } 

    fscanf(loadFile,"%d",&nAtom); 
    for (n=0; n<nAtom; ++n){ 
     fscanf(loadFile, "%f %f %f %f %f %f", 
       &r[n][0],&r[n][1],&r[n][2],&rv[n][0],&rv[n][1],&rv[n][2]); 
    } 

    fclose(loadFile); 

    for (n=0; n<nAtom; ++n){ 
     printf("%12.9f %12.9f %12.9f %12.9f %12.9f %12.9f\n", 
       r[n][0],r[n][1],r[n][2],rv[n][0],rv[n][1],rv[n][2]); 
    } 

输出:

0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 
0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000 

谁能说什么,我做错了什么?

+4

'的fscanf(使用loadFile “%F%F%F%F%F%F”,... ''使用'%lf'作为'double' – BLUEPIXY

+2

总是检查像'fscanf'那样的函数返回值,这样你就知道正确的字段被读取和转换了。'if(6!= fscanf(....' –

+1

'printf'系列的函数将'float'提升为'double',因此它们以相同的方式处理'%f'和'%lf'(期待8字节参数)。 pecifiers('%f'和'%lf')只有在用于'scanf'系列的函数中才有区别。 –

回答

1

正如@BLUEPIXY在评论中所说的,您正在告诉fscanf将您的输入值解析为float s,但将它放入double s。您可以通过(如建议)使用%lf来告诉fscanf您正在填充双打,或者宣布rrvfloat的数组来解决此问题。

编译器对于这类事情的警告非常好,如果你问得好。

0

你的fscanf应该是这样的:

fscanf(loadFile, "%lf %lf %f %lf %lf %lf",&r[n][0],&r[n][1],&r[n][2],&rv[n][0],&rv[n][1],&rv[n][2]); 

然后删除该行

fscanf(loadFile,"%d",&nAtom); 
+0

'\ n'不是必需的。 –

+0

这是为什么?在6个double值之后会有一个\ n。 –

+0

我建议你试试看,找出答案。 –