使用fscanf(C)从文件中提取double

时间:2014-10-18 18:13:26

标签: c file scanf

这是我的问题,我有这些数据:

  // input 1        input 2         output
  -2.9300000e+00  -8.3227505e-01  -7.4588269e+00
   1.1500000e+00   6.7039029e-01   6.3757647e-02
  -3.6000000e-01  -3.9144914e-01   5.9973550e-01
   7.0000000e-01   1.1649989e+00  -2.0060024e+00
  -1.7900000e+00  -4.9222540e-02  -4.7662334e+00
  -9.0000000e-02  -1.4490347e+00  -1.3910318e+00

我想把它们放在一个数组中,但没有任何作用。我试图用fgetc和fseek移动,似乎我的代码理解我想要的格式,但我的数组在运行结束时总是空的。这是我目前的代码:

int hauteur = 6;
int largeur = 3;
FILE* fichier = NULL;
Data data;
data.dimDonnees = largeur;
data.nombreDonnees = hauteur;
int i, j, c;
double **tab;

// Attribution dynamique de mémoire
tab = creerMatrice(hauteur, largeur);

if ((fichier = fopen(nomFichier, "r+")) == NULL ) {
    printf("Erreur lors du chargement de %s",nomFichier);
}

// On passe la première ligne de caractères
for(i=0;i<43;i++){fgetc(fichier);}

for (i=0; i<hauteur; i++) {
    for (j=0; j<largeur; j++) {
        // On avance jusqu'à ce que le caractère ne soit ni un espace ni un retour chariot
        while( (c = fgetc(fichier)) == 32 || c == 10 ){}
        fseek(fichier,-1,SEEK_CUR);
        fscanf(fichier, "%e", &tab[i][j]);
    }
}

最终这里是函数creerMatrice():

double** creerMatrice(int n, int p) {
    double** tab;
    int i;
    tab = malloc(n*sizeof(*tab));
    for(i=0;i<n;i++) {
        tab[i]=malloc(p*sizeof(**tab));
    }
    return tab;
}

2 个答案:

答案 0 :(得分:1)

实际上,现在它起作用了,我真的不知道为什么但是它有效! 我juste替换

 fscanf(fichier, "%e", &tab[i][j]);

通过

 fscanf(fichier, "%le", &tab[i][j]);

我和fseek再一次回去。

答案 1 :(得分:1)

tab [] []包含双精度数,但您使用了scanf代码进行浮动。 fscanf()会将一个数字的二进制32位浮点表示写入内存,然后相同的二进制值将被解释为double,这将导致一个非常不同的值。 scanf,printf等不执行任何隐式转换 - 它们使用给定的代码完全按照给定的方式解释内存,因此它们总是必须匹配实际数据类型才能使结果有意义。