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 ; .
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
}
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