Aide programme C

mator -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour j'ai ecrit un petit programme tout simple qui me permet de numeroter un fichier lu mais quand je veux lire comme dans le programme 75000 lignes le systeme se bloque vers les 55000 lignes.
Que dois je changer pour pouvoir lire plus de lignes sans bloquer le micro?
Merci

Voici le programme :

# include <stdio.h>
main ()
{
FILE *leno;
FILE *noki;
char write[12];
char import[11];

unsigned short xab[75000][12];
unsigned short m,n;
leno = fopen ("write","w");
noki = fopen ("denomb" , "r");
scanf("%u",&x);
for(m=0;m<x;m++) {
for(n=0;n<11;n++) {
fscanf(noki,"%hu",&xab[m][n]);
}
fprintf(leno,"%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu\n",m+1,xab[m][0],xab[m][1],xab[m][2],xab[m][3],xab[m][4],xab[m][5],xab[m][6],xab[m][7],xab[m][8],xab[m][9],xab[m][10]);

}


printf("fin");
fclose (leno);
}

3 réponses

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Ben euh t'as pas l'impression que c'est un poil bourrin de stocker 75000*12* la taille d'un short en mémoire ?

La vraie question est en fait, est-il nécessaire de conserver en mémoire une matrice aussi grande ou ne peut-on pas fonctionner ligne par ligne ? Car au final on pourrait faire simplement :
unsigned short xab[12];
unsigned short m,n;
leno = fopen ("write","w");
noki = fopen ("denomb" , "r");
scanf("%u",&x);
for(m=0;m<x;m++) {
  for(n=0;n<11;n++) {
    fscanf(noki,"%hu",&xab[m][n]);
  }
  fprintf(leno,"%hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu %hu\n",m+1,xab[0],xab[1],xab[2],xab[3],xab[4],xab[5],xab[6],xab[7],xab[8],xab[9],xab[10]);
} 

Par ailleurs pourquoi ne pas simplement tester si noki à atteint la fin du fichier EOF. Enfin quel interêt de stocker les valeurs dans un tableau ? Pourquoi ne pas les écrire directement au fur et a mesure ?
unsigned short int val_lue;
int ret_fscanf;
while(ret_fscanf!=EOF) {
  for(n=0;n<11;n++) {
    ret_fscanf(noki,"%hu",&val_lue);
    fprintf(leno,"%hu %hu ",n,val_lue);
  }
} 

Par ailleurs
- tu n'as pas declaré x, mais a priori on n'en a plus besoin
- tu as oublié de fermer le fichier noki
- pour être standard la fonction main retourne un int désignant le code d'éxecution (0 si le programme se finit bien, le code d'erreur sinon)
- les variables write et import semblent ne servir à rien
int main(){
  ...
  return 0;
}

Au final ça donne :
# include <stdio.h>

int main (){
  FILE *leno;
  FILE *noki;

  unsigned short val_lue;
  unsigned short n;
  int ret_fscanf
  leno = fopen ("write","w");
  noki = fopen ("denomb" , "r");
  //scanf("%u",&x);

  while(ret_fscanf!=EOF) {
    for(n=0;n<11;n++) {
      ret_fscanf(noki,"%hu",&val_lue);
      fprintf(leno,"%hu %hu ",n,val_lue);
    }
  } 
  
  printf("fin");
  fclose (leno);
  fclose (noki);
  return 0;
}

Je n'ai pas compilé et testé le code mais c'es quelque chose dans le genre...

Bonne chance
0
mator
 
Bonjour et merci pour le programme.
J'essaye de le tester et j'ai rajouté la declaration du x, mais j'ai un message d'erreur pour cette ligne :
ret_fscanf(noki,"%hu",&val_lue);

Le message d'erreur est : " call of non-function "

En vois tu la raison?

merci
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Ca me déçoit un peu que tu ne sois pas en mesure de la corriger tout(e) seul(e) ça veut dire que tu n'as pas essayé de comprendre ce que j'"ai écrit... C'est ret=fscanf....

@+
0