Nombre d'entier d'un fichier composé de chiffres

ValToutCourt Messages postés 3 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 23 avril 2004 - 21 avril 2004 à 10:22
ValToutCourt Messages postés 3 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 23 avril 2004 - 23 avril 2004 à 17:33
Bonjour à tous,
j'ai un probléme en programmation, je dois recupérer le nombre d'entier stoké dans un fichier, ca parait bidon, mais j'ai deja tout essayé et ca marche pas!!!Je recupére toujours un chiffre bidon.

Je m'explique:
L'énoncé du probléme est le suivant:
"Construire un fichier de données comportant un certain nombre d'entiers en utilisant un editeur de texte. On ouvrira ce fichier puis on lira les données de ce fichier pour les trier en ordre non décroissant. "

Le programme est presque fait.Il me reste a savoir CE nombres de chiffres!

Comment faire pour recupérer le nombre exact de chiffres de mon fichier? (il me sert a créer mon tableau dans lequel j'effectue mon trie).
Je ne sais pas si mon probleme proviens du fichier de données ou de ma fonction elle meme.

int taille_fichier(char *fichier)
{int p, taille_fich,taille_lue;
int tabchar[BUFSIZE];
FILE *f;

if ((f=fopen(fichier,"r"))==0) {exit(2);}

p=0;
while((taille_lue=fread(tabchar,sizeof(int),BUFSIZE,f)) ==BUFSIZE)
p++;

taille_fich=p*BUFSIZE+taille_lue;
fclose(f);
return taille_fich;
}

Merci d'avance pour ceux qui pourrait m'eclairer!!

Val

5 réponses

c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005
21 avril 2004 à 10:46
Tu as essayé ceci "taille_fich=taille_fich+taille_lue "?
Cmill
0
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
21 avril 2004 à 14:14
La solution devrait etre assez simple a comprendre ...
En fait les nombres qui composent ton fichier c'est toi meme qui les a rentrés on est d'accord ? Donc ca fait que tu dois les récupérer en utilisant la fonction fscanf car la fonction fread ne lit que les fichiers écrits en binaire et non sous forme de texte comme tu l'as fait pour ton fichier contenant les nombres... Tu me suis ?
tu fais une boucle qui parcoure ton fichier du debut a la fin, utilisant fscanf et incrementant un compteur a chaque nombre trouvé. Ca donne un trcu du genre :

// on suppose que ton fichier est deja ouvert et tout...
int nbNbre=0; // <==> a ta variable p en fait
int temp;

while(!feof(f))
{
fscanf(f,"%d",&temp);
nbNbre++;
}

return temp;

C'est aussi simple que ca... essaye, tu verras ca devrait marcher comme ca. Tiens moi au courant.
Et surtout n'oublie pas la grande différence entre fread et fscanf : fread lit les fichiers binaires (utile si tu veux récupéré des données écrites à l'aide de la fonction fwrite dans un fichier(très utile pour sauvegarder/charger des structures) alors que fscanf lit les fichiers en mode texte (ca recupere les données telles que les entiers, les chaines de caracteres etc.). Voila voila.
J'attends de tes news.
++
0
ValToutCourt Messages postés 3 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 23 avril 2004
22 avril 2004 à 13:48
C'est impec!!!
Mon programme fonctionne, j'ai tout modifié comme tu me l'as indiqué meme la suite du programme!
C'est cool! :)
Merci!

Par contre, j'ai un autre probléme pour une autre fonction d'affichage, quand j'utilise cette meme structure, il m'affiche deux fois le dernier chiffre!

C'est a dire quand mon fichier est composé de 1 2 3 il m'affiche 1 2 3 3.


while(!feof(f))
{fread(&i,sizeof(int),1,f);
printf("%d|",i);
}

avec fscanf(f,"%d",&i), le resultat tourne en boucle et ne s'arrete plus!

Je l'ai modifié de cette facon:

while(fread(&i,sizeof(int),1,f))
{ printf("%d|",i);
}
programme qui marche.

Mais Y a t il pas moyen de garder la structure while(!feof(f)) ?

Val
0
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
22 avril 2004 à 23:34
Ya peut etre une solution mais je la trouve moi meme un peu trop "bourrinne" et je suis mem pas sur qu'elle fonctionnerait... il faudrait rejouter un autre test dans la boucle...
En fait faudrait tester si ya encore la place de recupérer un entier dans le fichier ouvert...
Un truc du genre :
while(!feof(f))
{
int tmp=ftell(f);
fseek(f,0L,SEEK_END);
if((ftell(f)-tmp)>= (sizeof(int)))
{
fseek(f,tmp,SEEK_SET);
fscanf(f,"%d",&d);
}
}

Je ne garantis pas que cette méthode marche pour plusieurs raisons :
- la fonction ftell est très utilisée pour les fichiers binaires mais la son action sera très limitée.
- je compare la taille entre la fin du fichier et la position courante pour savoir si il ya la place e mettre un entier encore et donc il se peut que ce test ne marche pas a tous les coups.... au pire si ca marche pas envoie moi la sour ce de ton programme et je verrai ce que je peux faire en gardant la structure du while(!feof())...
Voila sur ce je te dis bonne prog et à très bientot pour de nouvelles news de ta part....
++
neo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ValToutCourt Messages postés 3 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 23 avril 2004
23 avril 2004 à 17:33
Je n'ai pas essayé cette solution, elle me semble un peu compliquée, ou lourde plutot!
Je pensais qu'il y avais peut etre une astuce toute bidon...Je vais laisser ma structure telle quelle!
Mais merci quand meme d'y avoir reflechi!

Dans la série combine, je sais qu'on peut faire un test dans la boucle:
while feof(stdin),servant à saisir des entiers au clavier, au cas ou on ne taperais pas un entier (une lettre par exemple)
Quelqu'un connaitrait-il ce test.Il permettrais de ne pas stopper la saisie.

int saisie(int tab[L])
{int n=0;
while((!feof(stdin))&&(n<=L))
{scanf("%d",tab+n);
if(TEST ENTIER) {n++;}
else {printf("Ce n'est pas un entier/chiffre");}
}
return n;
}

Merci pour vos reponses!

Val
0
Rejoignez-nous