Aide programme C

Fermé
mator - 13 avril 2006 à 00:38
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 20 avril 2006 à 12:27
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
13 avril 2006 à 01:27
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
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
20 avril 2006 à 12:27
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