Aide programme C
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);
}
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);
}
A voir également:
- Aide programme C
- Programme demarrage windows - Guide
- Message programmé iphone - Guide
- Mettre en veille un programme - Guide
- Programme word gratuit - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
3 réponses
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 :
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 ?
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
Au final ça donne :
Je n'ai pas compilé et testé le code mais c'es quelque chose dans le genre...
Bonne chance
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