这是我的问题,我有这些数据:
// 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;
}
答案 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等不执行任何隐式转换 - 它们使用给定的代码完全按照给定的方式解释内存,因此它们总是必须匹配实际数据类型才能使结果有意义。