RECHERCHER :
COMMUNAUTE MP
Identifiez vous ...
Devenir Membre
J'ai oublié mon MDP
DOMAINE MP
Bavardages
Langages Généraux
Langages Web
Langages DotNet
Autres langages
Dev. Jeux Video
Sécurité
Sys. Exploitation
Graphismes
Logiciels
Réseaux
Bases de données
Méthodologies
Emplois High-tech
Aide juridique
Articles juridiques
FORUM
Index des forums
Ajouter un sujet
Rechercher sujet
Contact Responsable
Devenir modérateur
CHAT MP IRC
Votre pseudo ...
Serv: irc.irc-land.org
Chan: #MoteurProg
PARTICIPER
Plus de 3500 emplois.
Rechercher un job
Déposez votre CV
Emplois High-tech

Visiteur MP

 Manipulation des fichiers en C

Forum : C
Sous Catégorie : Aucune
Type du sujet : Sujet Normale
FAQ : FAQ C

SUIVI DES SUJETS PAR MAIL

SUIVI PAR MAIL INACTIF

RESOLUTION DU SUJET SUJET NON RESOLU
BLOQUAGE DU SUJET SUJET ACTIF
APPARTENANCE A LA FAQ N'APPARTIENT PAS A LA FAQ


PAGE : [1]

POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

FORUM C

PREMIERE PAGE

PAGE PRECEDENTE

Page précedente

Page suivante

PAGE SUIVANTE

DERNIERE PAGE
Archy27
Nouveau membre
Inscrit : 29/08/2007
Messages : 2
Message
#141981
Posté le 29/08/07 à 22:26
Bonjour à tous et à toutes.

Voilà j\'aurais besoin d\'un coup de main sur la création d\'une fonction en C.
Le type de la fonction est ville *lireVilles (FILE *fvilles, int *pnombre) qui lit un fichier texte dont chaque ligne est de la forme : nom ; population.
De plus, il faut que cette fonction renvoit un tableau de villes et fixe leur nombre dans l\'entier pointé par pnombre sachabt que le nombre de villes <= 2000 et que le nom d\'une ville ne dépasse pas 100 caractères.
Ma question se porte donc sur: comment lire un fichier grâce à fopen() ligne par ligne en ne mélangeant pas le nom et la population qui sont séparés par un ; .

Voici le début de code que j\'ai pu construire:


typedef struct { char *nom; int population; } ville; ville *lireVilles (FILE *fvilles, int *pnombre) { ville *v = null; int i; char tab[1]; int nombredevilles; nombredevilles = *pnombre; while (i = fread(tab,sizeof(char),1,fvilles) !=0) { // Comment dissocier le nom de la population sachant // qu\'ils sont séparés par un ; } ... // Grâce au nom et à la population obtenue par la boucle while, // il faut désormais les mettre dans un tableau return v; }


Sachant que *pnombre correspond au nombre de villes que l\'on doit mettre dans le tableau de villes. Donc voilà, si quelqu\'un a quelques minutes pour me répondre ca serait très coopératif de sa part car je n\'y arrive vraiment depuis quelques jours à résoudre ce problème.

/\\ ATTENTION : Il ne faut pas utiliser le prototype strtok() pour découper le nom et la population séparé par le ; .

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Publicité
Inscrit : X
Messages : X
Message
#Aucun

HAUT DE PAGE

  

popol
Membre actif
Avatar de popol
Inscrit : 17/10/2006
Messages : 125
Message
#142030
Posté le 30/08/07 à 18:23
Je t'ai tapé un code que je n'ai pas pu tester il-y-a peut-être des erreurs mais le principe est là.
Vu ton exemple je considère que ton fichier a été ouvert en mode binaire.
la variable indic permet d'indiquer 3 choses :
nom1;popul1;nom2;popul2;nom3;popul3;nom4;popul4;nom5;popul5;nom6;popul6
indic:
0 1 2 3 4 5 6 7 8 9 10 11
indic%2:
0 1 0 1 0 1 0 1 0 1 0 1
indic/2:
0 0 1 1 2 2 3 3 4 4 5 5
(division entière)
tu peut remarquer que lorsque c'est un nom indic%2=0 et lorsque c'est la population indic%2=1
et indic/2 correspond à la case a écrire dans ton tableau


typedef struct { char *nom; int population; } ville; ville *lireVilles (FILE *fvilles, int *pnombre) { ville v[2000] ={0};//création d'un tableau suffisament grand pour contenir un max de villes char str_temp[100];//chaine de charactères temporaire pour stocker le mot en lecture int pos_str=0;//stocke position dans le mot temporaire ou écrire la lettre char tab;//contient la lettre lue int indic=0;// indiquateur qui permet de savoir combien de ; ont étés lus, dans quelle case du tableau stocker le mot (indic/2) et de savoir si le mot en lecture est le nom(paire) ou la population(impaire) while (fread(&tab,sizeof(char),1,fvilles)!=0) { //lire une lettre tant que le fichier n'est pas fini if(tab==";"){//si la lettre est un ; if(indic%2==0){//soit le mot en lecture est un nom str_temp[pos_str]=0;//donc on met le caractère de fin au mot strcpy(v[indic/2].nom,str_temp)// et on le copie dans la case(indic/2) du tableau } if(indic%2==1)//soit le mot en lecture est la population { str_temp[pos_str]=0;/donc on met le caractère de fin au mot v[indic/2].population=strtol(str_temp,NULL,10);//et on stocke le mot sous forme de long(égal à int) en utilisant la base 10 } indic++;//on incrémente car on a trouvé un ; (mot suivant) pos_str=0;//l'écriture du mot recommencera au début if(indic/2>*pnombre)//si le nombre de case a lire est atteint break;//on quitte la boucle while } else{//si la lettre lue n'est pas ; str_temp[pos_str]=tab;//on la stocke dans le mot pos_str++;//et on incrémente la position } } return v; //enfin on retourne le tableau }

__________________________
n'hesitez pas à visiter Mon site et surtout Mon Tutorial C

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 

Archy27
Nouveau membre
Inscrit : 29/08/2007
Messages : 2
Message
#142031
Posté le 30/08/07 à 18:42
Merci beaucoup popol je m'en vais de ce pas tester et faire les modifications nécessaires s'il y a lieu d'en faire! Au moins le principe est là comme tu dis donc je vais m'appuyer sur çà ;). Bonne journée à toi Smiley

HAUT DE PAGE

PROFIL MEMBRE LUI ECRIRE 
POSTER UN NOUVEAU SUJET REPONDRE A CE SUJET

PREMIERE PAGE

PAGE PRECEDENTE Page précédente

Page suivante

PAGE SUIVANTE DERNIERE PAGE

FORUM C



    PAGE : [1]



.: Site Web développé par Julien Pichot et l'équipe MPWG avec www.evolvia-web.com :.