C fscanf qui ne lit pas toutes les données
Novartis
-
Novartis -
Novartis -
Bonjour,
J'ai un souci j'ai un fichier à lire celui-ci est une matrice de donné de 4210*210, (où la première donnée ne m'intéresse pas pour chaque individu, c'est pour ça que je l'enlève) que je stock dans un fichier fpfpd. Il s'avère que quand je veux exécuter ce script mon compilateur m'annonce que j'ai une erreur de segmentation, ceci certainement dû (quasiment sûr) au fscanf qui ne veut pas lire pour 4210 (ligne) mais veut bien pour 327 (j'ai essayé c'est le maximum).
J'ai vu qu'il 'avait déjà des soucis avec ce gnere de problème et j'ai vu qu'on parlait de "malloc", étant un jeune étudiant est pas vraiment expérimenté sur C, il y'a pas mal de choses que je ne comprends pas en C, donc pouvez-vous m'aider pour mon problème., me donner une solution avec le malloc ou non si y'a pas besoin...
Merci d'avance, je vous donne le script que j'ai tapé:
#include<stdio.h>
#include<math.h>
void floersheim(int N,int P){
int a=0;
int b=0;
int i=0;
int j=0;
FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
fscanf(file,"%lf",&temp);
for(j=0;j<P;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
printf("%lf ",tab[i][j]);
}
}
fclose(file);
}
int main(void){
floersheim(4210,210);
return 0;
}
J'ai un souci j'ai un fichier à lire celui-ci est une matrice de donné de 4210*210, (où la première donnée ne m'intéresse pas pour chaque individu, c'est pour ça que je l'enlève) que je stock dans un fichier fpfpd. Il s'avère que quand je veux exécuter ce script mon compilateur m'annonce que j'ai une erreur de segmentation, ceci certainement dû (quasiment sûr) au fscanf qui ne veut pas lire pour 4210 (ligne) mais veut bien pour 327 (j'ai essayé c'est le maximum).
J'ai vu qu'il 'avait déjà des soucis avec ce gnere de problème et j'ai vu qu'on parlait de "malloc", étant un jeune étudiant est pas vraiment expérimenté sur C, il y'a pas mal de choses que je ne comprends pas en C, donc pouvez-vous m'aider pour mon problème., me donner une solution avec le malloc ou non si y'a pas besoin...
Merci d'avance, je vous donne le script que j'ai tapé:
#include<stdio.h>
#include<math.h>
void floersheim(int N,int P){
int a=0;
int b=0;
int i=0;
int j=0;
FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
fscanf(file,"%lf",&temp);
for(j=0;j<P;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
printf("%lf ",tab[i][j]);
}
}
fclose(file);
}
int main(void){
floersheim(4210,210);
return 0;
}
A voir également:
- C fscanf qui ne lit pas toutes les données
- Fuite données maif - Guide
- Comment savoir si quelqu'un lit mes messages sur whatsapp - Accueil - Messagerie instantanée
- Effacer les données de navigation sur android - Guide
- Mon pc ne lit pas ma clé usb - Guide
- Trier des données excel - Guide
11 réponses
ça segfault parce que tu essayes de stocké quelquechose dans deux variable temp et tab que tu n'as pas déclaré
il faut que tu les declares selon leur type...
il faut que tu les declares selon leur type...
Oups! pardon!
J'ai voulu faire du copier/coller pour mettre ce qui peut vous intéresser et dans le coup j'ai oublier de mettre justement ça:
double temp;
double tab[N][P];
Donc pour réponse oui en fait je les ai déclaré donc le problème n'est pas résolu...
J'ai voulu faire du copier/coller pour mettre ce qui peut vous intéresser et dans le coup j'ai oublier de mettre justement ça:
double temp;
double tab[N][P];
Donc pour réponse oui en fait je les ai déclaré donc le problème n'est pas résolu...
essaye en faisant
for(j=0;j<P-1;j++){
fscanf(file,"%lf",&tab[i][j]);
printf("%lf ",tab[i][j]);
} comme tu enleves la premiere valeur
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
#include<stdio.h>
#include<math.h>
void floersheim(int N,int P){
int a=0;
int b=0;
int i=0;
int j=0;
double temp;
double SB[N];
double SA[N];
double tab[N][P];
double No[N][N];
double Dc[N][N];
double VA[N][N][P];
double Den[N][N][P];
double SAB[N][N];
FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
fscanf(file,"%lf",&temp);
for(j=0;j<P-1;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
printf("%lf ",tab[i][j]);
}
}
fclose(file);
FILE * f = fopen("/home/varin/Molecules/JC/Md61.R", "w");
for(a=0;a<N;a=a+1){
printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
fprintf(f,"%lf ",Dc[a][b]);
//printf("%lf\n",Dc[a][b]);
}
fprintf(f,"\n");
}
fclose(f);
}
int main(void){
floersheim(280,210);
return 0;
}
Voilà j'ai mis tout mon code... Effectivement peut-être ça ne vient pas du fscanf mais du fprintf...?!
#include<math.h>
void floersheim(int N,int P){
int a=0;
int b=0;
int i=0;
int j=0;
double temp;
double SB[N];
double SA[N];
double tab[N][P];
double No[N][N];
double Dc[N][N];
double VA[N][N][P];
double Den[N][N][P];
double SAB[N][N];
FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
fscanf(file,"%lf",&temp);
for(j=0;j<P-1;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
printf("%lf ",tab[i][j]);
}
}
fclose(file);
FILE * f = fopen("/home/varin/Molecules/JC/Md61.R", "w");
for(a=0;a<N;a=a+1){
printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
fprintf(f,"%lf ",Dc[a][b]);
//printf("%lf\n",Dc[a][b]);
}
fprintf(f,"\n");
}
fclose(f);
}
int main(void){
floersheim(280,210);
return 0;
}
Voilà j'ai mis tout mon code... Effectivement peut-être ça ne vient pas du fscanf mais du fprintf...?!
Alors j'ai vérifié, ce n'est pas le fscanf ou le fprintf ou je ne sais quoi qui bloque en fait c'est dans ma boucle de calcul que ça bloque:
for(a=0;a<N;a=a+1){
printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
Donc je re Up! Pour de l'aide s'il vous plait..!
Merci d'avance.
for(a=0;a<N;a=a+1){
printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
Donc je re Up! Pour de l'aide s'il vous plait..!
Merci d'avance.
#include<stdio.h>
#include<math.h>
void floersheim(int N,int P){
int a=0;
int b=0;
int i=0;
int j=0;
double temp;
double SB[N];
double SA[N];
double tab[N][P-1];
double No[N][N];
double Dc[N][N];
double VA[N][N][P];
double Den[N][N][P];
double SAB[N][N];
FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
printf("%d\n",i);
fscanf(file,"%lf",&temp);
for(j=0;j<P-1;j++){
fscanf(file,"%lf\tab",&tab[i][j]);
//printf("%lf ",tab[i][j]);
}
}
fclose(file);
FILE * f = fopen("/home/varin/Molecules/JC/Md61.R", "w");
for(a=0;a<N;a=a+1){
//printf("%d\n",a);
for(b=0;b<N;b=b+1){
for(j=0;j<P-1;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
fprintf(f,"%lf ",Dc[a][b]);
//printf("%lf\n",Dc[a][b]);
}
fprintf(f,"\n");
}
fclose(f);
}
int main(void){
floersheim(2801,211);
return 0;
}
Donc où il'a le problème c'est ici:
for(a=0;a<N;a=a+1){
for(b=0;b<N;b=b+1){
for(j=0;j<P-1;j=j+1){
SA[a]=SA[a] + tab[a][j];
SB[b]=SB[b] + tab[b][j];
SAB[a][b]=SA[a]+SB[b];
VA[a][b][j]=(tab[a][j]-tab[b][j]);
if(VA[a][b][j]<0)
VA[a][b][j]=-VA[a][b][j];
else
VA[a][b][j]=VA[a][b][j];
if(tab[a][j]<=tab[b][j])
Den[a][b][j]=(1+tab[a][j]);
else
Den[a][b][j]=(1+tab[b][j]);
No[a][b]=No[a][b]+(VA[a][b][j]/Den[a][b][j]);
}
Dc[a][b]=(No[a][b]/SAB[a][b]);
}
for(a=0;a<N;a=a+1){
for(b=0;b<N;b=b+1){
for(j=0;j<P-1;j=j+1){
pourtant les boucles sont correctes, peut etre que N est mal initialisé, où que si ce N est le retour d'une fonction cette fonction soit foireuse moi je regarderais de ce coté là.
juste un truc, tu peux faire a++; au lieu de a=a+1 ou encore a += 1
Je n'ai pas tout compri pour le retour d'une fonction par rapport à N... :S
Merci pour le truc^^
Merci pour le truc^^
Ben en gros si tu recodes str_len et que tu te plantes, et que ton str_len te retourne invariablement la longueur de la chaine + 1, si tu as un code style:
Ben là il ya de grandes chances que ça segfault vu que le retour de str_len_foireux est foireux justement, dans le cas qui nous interesse ton compteur n'atteint jamais N a mon avis du fait que soit N est le retour d'une fonction qui merde, ou bien N est negatif et vu que ton compteur est certainnement initialisé a 0 et que tu l'incrémentes, ben ya peu de chance que ce compteur soit un jour égal a N, ou alors il sera tombé dans un trou spatio-temporel, mais là c'est une autre histoire.
Ou bien encore N est égal a 42, et là on peut rien faire :D
int len; len = str_len_froireux(str); for(i = 0, i < len, i++) write(1, &str[i], 1);
Ben là il ya de grandes chances que ça segfault vu que le retour de str_len_foireux est foireux justement, dans le cas qui nous interesse ton compteur n'atteint jamais N a mon avis du fait que soit N est le retour d'une fonction qui merde, ou bien N est negatif et vu que ton compteur est certainnement initialisé a 0 et que tu l'incrémentes, ben ya peu de chance que ce compteur soit un jour égal a N, ou alors il sera tombé dans un trou spatio-temporel, mais là c'est une autre histoire.
Ou bien encore N est égal a 42, et là on peut rien faire :D
Moué... J'ai pas tout saisi...
Enfin bon c'est pas grave je peux me passer de ce code en C mais il est vrai que j'aurai aimé pouvoir l'utiliser...
En tout cas merci à tous ceux qui m'ont aidé et si il y'a d'autres suggestions d'explication je suis preneur!
Enfin bon c'est pas grave je peux me passer de ce code en C mais il est vrai que j'aurai aimé pouvoir l'utiliser...
En tout cas merci à tous ceux qui m'ont aidé et si il y'a d'autres suggestions d'explication je suis preneur!
Voilà mon code final, il marche très bien!
Le problème venait de la lecture dans le fscanf, la retranscription se faisait en chaine de caractère et non en nombre. Donc je fais une lecture d'une chaine de caractère que j'ai déclaré en tant que tel et j'ai utiliser atof pour que cette chaine de caractère devienne un nombre à virgule.!
Le problème venait de la lecture dans le fscanf, la retranscription se faisait en chaine de caractère et non en nombre. Donc je fais une lecture d'une chaine de caractère que j'ai déclaré en tant que tel et j'ai utiliser atof pour que cette chaine de caractère devienne un nombre à virgule.!
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
void floersheim(int N,int P){
int a=0;
int b=0;
int i=0;
int j=0;
char temp;
char *str;
float tab[N][P-1];
float num;
float denom;
float Dc[N][N];
FILE * file = fopen("/home/varin/Molecules/JC/AID567_08_04_08_actAll_inact1sur26_stdz.fpfpd", "r");
for(i=0;i<N;i++){
printf("%d\n",a);
fscanf(file,"%s",&temp);
for(j=0;j<P-1;j++){
str=malloc(100);
fscanf(file,"%s",str);
//printf("%s ",str);
tab[i][j]=atof(str);
}
}
fclose(file);
printf("calculs\n");
FILE * f = fopen("/home/varin/Molecules/JC/Md61", "w");
for(a=0;a<N;a++){
printf("%d\n",a);
for(b=0;b<N;b++){
num = 0;
denom = 0;
for(j=0;j<P-1;j++){
denom += tab[a][j] + tab[b][j];
num += (abs(tab[a][j]-tab[b][j]))/(1 + ((tab[a][j] + tab[b][j]) - abs(tab[a][j]-tab[b][j])) / 2);
}
Dc[a][b]=(num / denom);
fprintf(f,"%f ",Dc[a][b]);
//printf("%f\n",Dc[a][b]);
}
fprintf(f,"\n");
}
fclose(f);
}
int main(void){
floersheim(2801,211);
return 0;
}