[C] Lire un fichier . txt URGENTISSIME
Dernière réponse : dans Programmation
Bonjour,
J'ai suivit des cours basique de programation en language C et j'ai un projet à rendre pour lundi matin !!
Aucun probléme pour ECRIRE mais je rencontre un probléme pour LIRE dans un fichier .txt et j'ai vraiment besoin de votre aide en tout urgence (Il reste du boulot et j'ai déja passer plusieur heures sur ce probléme) !
Le sujet : Coder un programme capable de gérer la location de voitures ... (Je vous la fait courte ^^) !
MON PROBLÈME :
Je me sert d'une "base de données" contenu dans un fichier .txt contenant les infos de chaque clients sur une unique ligne
EXEMPLE : (deux clients, dans l'ordre : leurs n° d'identifiant, nom, prenom, tel)
ID;1;PERRON;Lucas;0189632147;
ID;2;PARIN;Pierre;0647475814;
J'utilise donc une structure :
typedef struct
{
int idEmploye;
char nom[100];
char prenom[100];
int tel;
int nbrKmEmploye;
int nbrAccident;
}Employe;
Le principe c'est que j'appel la base de donner en tout début de programme pour remplir les cases du tableau (dont j'ai besoin par la suite) :
Employe tabEmploye[100];
(Dans notre cas seul les 2 premieres cases seront utilisées)
Voici mon code, je compte sur vous pour me dire ce qu'il ne va pas
void miseAJourInitiale ()
{
int i;
char tampon[100]; // Pour eviter un bug qui lit tout la ligne lors du 1er fscanf d'un char
FILE *fichier1;
fichier1=fopen("véhicules.txt","r" );
if(fichier1==NULL)
fclose(fichier1);
else
{
for (i=1; i<100; i++)
{
if (getc(fichier1) != EOF)
{
fseek(fichier1,2, SEEK_CUR);
fscanf(fichier1,"%d;",&tabEmploye.idEmploye);
fscanf(fichier1,"%s;",&tampon);
fscanf(fichier1,"%s;",&tabEmploye.nom);
fscanf(fichier1,"%s;",&tabEmploye.prenom);
fscanf(fichier1,"%d;",&tabEmploye.tel);
fscanf(fichier1,"%d;",&tabEmploye.nbrKmEmploye);
fscanf(fichier1,"%d;",&tabEmploye.nbrAccident);
printf("\n..%d..%s..%s..%d..%d..%d..\n", tabEmploye.idEmploye, tabEmploye.nom, tabEmploye.prenom, tabEmploye.tel, tabEmploye.nbrKmEmploye, tabEmploye.nbrAccident);
}
}
system("PAUSE" );
}
fclose(fichier1);
}
Le programme me donne un résultat abérant, ne prennant pas en compte les char (Et les int sont faux ^^)
..1......0..0..
PS : je n'ai méme pas encore codé pour rentrer les valeur dans le tableau car les données lut sont erronées vu le résultat du printf ....
Je ne peut pas continuer sans votre aide :s
Un énorme merci par avance car c'est vraiment URGENTISSIME... quitte a faire une nuit blanche
J'ai suivit des cours basique de programation en language C et j'ai un projet à rendre pour lundi matin !!
Aucun probléme pour ECRIRE mais je rencontre un probléme pour LIRE dans un fichier .txt et j'ai vraiment besoin de votre aide en tout urgence (Il reste du boulot et j'ai déja passer plusieur heures sur ce probléme) !
Le sujet : Coder un programme capable de gérer la location de voitures ... (Je vous la fait courte ^^) !
MON PROBLÈME :
Je me sert d'une "base de données" contenu dans un fichier .txt contenant les infos de chaque clients sur une unique ligne
EXEMPLE : (deux clients, dans l'ordre : leurs n° d'identifiant, nom, prenom, tel)
ID;1;PERRON;Lucas;0189632147;
ID;2;PARIN;Pierre;0647475814;
J'utilise donc une structure :
typedef struct
{
int idEmploye;
char nom[100];
char prenom[100];
int tel;
int nbrKmEmploye;
int nbrAccident;
}Employe;
Le principe c'est que j'appel la base de donner en tout début de programme pour remplir les cases du tableau (dont j'ai besoin par la suite) :
Employe tabEmploye[100];
(Dans notre cas seul les 2 premieres cases seront utilisées)
Voici mon code, je compte sur vous pour me dire ce qu'il ne va pas
void miseAJourInitiale ()
{
int i;
char tampon[100]; // Pour eviter un bug qui lit tout la ligne lors du 1er fscanf d'un char
FILE *fichier1;
fichier1=fopen("véhicules.txt","r" );
if(fichier1==NULL)
fclose(fichier1);
else
{
for (i=1; i<100; i++)
{
if (getc(fichier1) != EOF)
{
fseek(fichier1,2, SEEK_CUR);
fscanf(fichier1,"%d;",&tabEmploye.idEmploye);
fscanf(fichier1,"%s;",&tampon);
fscanf(fichier1,"%s;",&tabEmploye.nom);
fscanf(fichier1,"%s;",&tabEmploye.prenom);
fscanf(fichier1,"%d;",&tabEmploye.tel);
fscanf(fichier1,"%d;",&tabEmploye.nbrKmEmploye);
fscanf(fichier1,"%d;",&tabEmploye.nbrAccident);
printf("\n..%d..%s..%s..%d..%d..%d..\n", tabEmploye.idEmploye, tabEmploye.nom, tabEmploye.prenom, tabEmploye.tel, tabEmploye.nbrKmEmploye, tabEmploye.nbrAccident);
}
}
system("PAUSE" );
}
fclose(fichier1);
}
Le programme me donne un résultat abérant, ne prennant pas en compte les char (Et les int sont faux ^^)
..1......0..0..
PS : je n'ai méme pas encore codé pour rentrer les valeur dans le tableau car les données lut sont erronées vu le résultat du printf ....
Je ne peut pas continuer sans votre aide :s
Un énorme merci par avance car c'est vraiment URGENTISSIME... quitte a faire une nuit blanche
Autres pages sur : lire fichier txt urgentissime
Lassé par la pub ? Créez un compte
Utilise le tag code pour l'affichage de ton code sur le forum, c'est plus facile à lire.
Alors déjà:
ça ne sert à rien de fermer un fichier que l'on n'a pas pu ouvrir.
Ceci ne me parait pas très propre. Il vaut mieux chercher avec le ';', à moins que tu ne sois sûr que:
- le format du fichier est toujours bon
- qu'aux boucles suivantes, tu ne te décale pas
Une chaine de caractère est un pointeur sur le premier caractère. Il ne faut pas prendre le pointeur du pointeur (ça peut faire crasher l'application ou faire du buffer overflow).
Idem avec prenom.
Comme tout est sur la même ligne et comme je ne sais plus comment le fscanf fonctionne
, est-ce qu'il ne faudrait pas plutôt faire un fscanf ("%d;%s;%s... sur toute la ligne?
Et en plus si le fichier ne peut pas être ouvert, tu le fermes 2 fois.
Alors déjà:
if(fichier1==NULL) fclose(fichier1);
ça ne sert à rien de fermer un fichier que l'on n'a pas pu ouvrir.
fseek(fichier1,2, SEEK_CUR);
Ceci ne me parait pas très propre. Il vaut mieux chercher avec le ';', à moins que tu ne sois sûr que:
- le format du fichier est toujours bon
- qu'aux boucles suivantes, tu ne te décale pas
&tabEmploye[i].nom
Une chaine de caractère est un pointeur sur le premier caractère. Il ne faut pas prendre le pointeur du pointeur (ça peut faire crasher l'application ou faire du buffer overflow).
Idem avec prenom.
Comme tout est sur la même ligne et comme je ne sais plus comment le fscanf fonctionne
, est-ce qu'il ne faudrait pas plutôt faire un fscanf ("%d;%s;%s... sur toute la ligne?
fclose(fichier1);
Et en plus si le fichier ne peut pas être ouvert, tu le fermes 2 fois.
Merci pour tes réponses ca m'éclaire réellement !!!
J'aime le : "T'est fort, tu arrive à fermer deux fois un fichier pas encore ouvert" xD
Je pensai pas que je pouvais me marrer en faisant de l'info ^^
Dsl pour l'écriture en tag code mais je suis qu'un petit zero
(D'ailleurs c'est ce site qui ma apprit à faire ce test d'ouverture fichier ... peut être que je l'ai mal interpréter ...)
, est-ce qu'il ne faudrait pas plutôt faire un fscanf ("%d;%s;%s... sur toute la ligne?
Oui je vais tenter c'est plus propre
Je test aussi de ce pas le probléme venant des char ...
Je me disait bien que de ce coté là ca ne devais pas aller ...
D'ailleur, je l'ai ai bien déclarer dans ma structure ou il manquer l'* du pointeur ?
Encore merci je reviens vite
J'aime le : "T'est fort, tu arrive à fermer deux fois un fichier pas encore ouvert" xD
Je pensai pas que je pouvais me marrer en faisant de l'info ^^
Dsl pour l'écriture en tag code mais je suis qu'un petit zero
(D'ailleurs c'est ce site qui ma apprit à faire ce test d'ouverture fichier ... peut être que je l'ai mal interpréter ...)
Citation :
Comme tout est sur la même ligne et comme je ne sais plus comment le fscanf fonctionne
, est-ce qu'il ne faudrait pas plutôt faire un fscanf ("%d;%s;%s... sur toute la ligne?Oui je vais tenter c'est plus propre
Je test aussi de ce pas le probléme venant des char ...
Je me disait bien que de ce coté là ca ne devais pas aller ...
D'ailleur, je l'ai ai bien déclarer dans ma structure ou il manquer l'* du pointeur ?
Encore merci je reviens vite
Bon bon !
Y'a du mieu
Lorsqu'il y a une ligne a lire, j'obtient : ..1..<nul>..<nul>..0..0..
Donc il prend en compte correctement mes char !
Seul probléme : ce ne sont pas les valeur que j'ai noté dans mon .txt
Je retourne voir ou peut bien étre l'erreur !
Y'a du mieu
Lorsqu'il y a une ligne a lire, j'obtient : ..1..<nul>..<nul>..0..0..
Donc il prend en compte correctement mes char !
Seul probléme : ce ne sont pas les valeur que j'ai noté dans mon .txt
Je retourne voir ou peut bien étre l'erreur !
typedef struct
{
int idEmploye; //incrementer de +1 pour chaque nouveau employe
char nom[100];
char prenom[100];
int tel;
int nbrKmEmploye; //Nombre de km total effectuer
int nbrAccident; // Utilse pour statistiques
}Employe;
Employe tabEmploye[100];
void main ()
{
int i;
char tampon[100];
FILE *fichier1;
fichier1=fopen("employés.txt","r");
if(fichier1!=NULL)
{
for (i=0; i<100; i++)
{
if (getc(fichier1) != EOF)
{
fseek(fichier1,2, SEEK_CUR);
fscanf(fichier1,"ID;%d;%s;%s;%s;%d;%d;%d",&tabEmploye[i].idEmploye, tampon, tabEmploye[i].nom, tabEmploye[i].prenom, &tabEmploye[i].tel, &tabEmploye[i].nbrKmEmploye, &tabEmploye[i].nbrAccident);
printf("\n..%d..%s..%s..%d..%d..%d..\n", tabEmploye[i].idEmploye, *tabEmploye[i].nom, *tabEmploye[i].prenom, tabEmploye[i].tel, tabEmploye[i].nbrKmEmploye, tabEmploye[i].nbrAccident);
system("PAUSE");
}
}
}
}
Bon je ne trouve vrément pas ou est le probléme ...
J'ai retouché le fscanf dans cette partie :
et quand je lance le programme avec ceci précrit dans le fichier txt :
ID;1;AAA;BBB;0123456789;1;2;
ID;2;CCC;DDD;0123456789;3;4;
ID;3;EEE;FFF;0123456789;5;6;
ID;4;GGG;HHH;0123456789;7;8;
J'obtient, sur la console :
..1..<nul>..<nul>..0..0..
..0..<nul>..<nul>..0..0..
..2..<nul>..<nul>..0..0..
..0..<nul>..<nul>..0..0..
..3..<nul>..<nul>..0..0..
..0..<nul>..<nul>..0..0..
..4..<nul>..<nul>..0..0..
Le probléme doit étre tout bête ... Mais en attendant je ne peut pas avancer -_-'
Toute aide est la bienvenu
J'ai retouché le fscanf dans cette partie :
for (i=1; i<100; i++)
{
if (getc(fichier1) != EOF)
{
fscanf(fichier1,"D;%d;%s;%s;%s;%d;%d;%d;",&tabEmploye[i].idEmploye, tampon, tabEmploye[i].nom, tabEmploye[i].prenom, &tabEmploye[i].tel, &tabEmploye[i].nbrKmEmploye, &tabEmploye[i].nbrAccident);
printf("\n..%d..%s..%s..%d..%d..%d..\n", tabEmploye[i].idEmploye, *tabEmploye[i].nom, *tabEmploye[i].prenom, tabEmploye[i].tel, tabEmploye[i].nbrKmEmploye, tabEmploye[i].nbrAccident);
system("PAUSE");
}
}
et quand je lance le programme avec ceci précrit dans le fichier txt :
ID;1;AAA;BBB;0123456789;1;2;
ID;2;CCC;DDD;0123456789;3;4;
ID;3;EEE;FFF;0123456789;5;6;
ID;4;GGG;HHH;0123456789;7;8;
J'obtient, sur la console :
..1..<nul>..<nul>..0..0..
..0..<nul>..<nul>..0..0..
..2..<nul>..<nul>..0..0..
..0..<nul>..<nul>..0..0..
..3..<nul>..<nul>..0..0..
..0..<nul>..<nul>..0..0..
..4..<nul>..<nul>..0..0..
Le probléme doit étre tout bête ... Mais en attendant je ne peut pas avancer -_-'
Toute aide est la bienvenu
RESOLU :
Le tampon ne sert a RIEN
Le ; induisait en erreur car il ne separent pas bien les char !
En mettant des espaces tout roule !
Voici le bon code :
Avec, ecrit au préalable dans le fichier txt :
ID;1;47;AA CC
ID;3;74;BB DD
La console affiche bien :
..1..47..AA..CC..
..3..74..BB..DD..
Merci pour ton aide
Bonne soirée
Le tampon ne sert a RIEN
Le ; induisait en erreur car il ne separent pas bien les char !
En mettant des espaces tout roule !
Voici le bon code :
typedef struct
{
int idEmploye;
char nom[100];
char prenom[100];
int nbrKmEmploye;
}Employe;
Employe tabEmploye[100];
void main ()
{
int i;
FILE *fichier1;
fichier1=fopen("employés.txt","r");
if(fichier1!=NULL)
{
for (i=1; i<100; i++)
{
if (getc(fichier1) != EOF)
{
fscanf(fichier1,"D;%d;%d;%s %s\n",&tabEmploye[i].idEmploye, &tabEmploye[i].nbrKmEmploye, tabEmploye[i].nom, tabEmploye[i].prenom);
printf("\n..%d..%d..%s..%s..", tabEmploye[i].idEmploye, tabEmploye[i].nbrKmEmploye, tabEmploye[i].nom, tabEmploye[i].prenom);
system("PAUSE");
}
}
}
fclose(fichier1);
}
Avec, ecrit au préalable dans le fichier txt :
ID;1;47;AA CC
ID;3;74;BB DD
La console affiche bien :
..1..47..AA..CC..
..3..74..BB..DD..
Merci pour ton aide
Bonne soirée
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumVbs lire fichier .txt
- solutionsMatlab lire un fichier txt
- ForumJava lire fichier txt
- ForumMatlab lire fichier txt
- ForumLire fichier txt langage c
- ForumLire fichier txt php
- ForumLire un fichier txt en java
- ForumJava lire un fichier txt
- ForumLire un fichier txt matlab
- ForumPhp lire un fichier txt
- Voir plus