A voir également:
- [C] Lire un fichier . txt
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire fichier epub - Guide
- Fichier rar - Guide
- Lire fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
3 réponses
RESOLU :
Le tampon ne sert a RIEN
Le ; induisait en erreur car il ne separe pas bien les char !
En mettant des espaces tout roule !
Voici le bon code :
Code :
1. typedef struct
2. {
3. int idEmploye;
4. char nom[100];
5. char prenom[100];
6. int nbrKmEmploye;
7. }Employe;
8.
9.
10.
11. Employe tabEmploye[100];
12.
13.
14. void main ()
15. {
16. int i;
17.
18. FILE *fichier1;
19. fichier1=fopen("employés.txt","r" );
20.
21. if(fichier1!=NULL)
22. {
23. for (i=1; i<100; i++)
24. {
25. if (getc(fichier1) != EOF)
26. {
27. fscanf(fichier1,"D;%d;%d;%s %s\n",&tabEmploye[i].idEmploye, &tabEmploye[i].nbrKmEmploye, tabEmploye[i].nom, tabEmploye[i].prenom);
28.
29.
30. printf("\n..%d..%d..%s..%s..", tabEmploye[i].idEmploye, tabEmploye[i].nbrKmEmploye, tabEmploye[i].nom, tabEmploye[i].prenom);
31. system("PAUSE" );
32. }
33. }
34. }
35. fclose(fichier1);
36.
37.
38. }
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..
Bonne soirée
Le tampon ne sert a RIEN
Le ; induisait en erreur car il ne separe pas bien les char !
En mettant des espaces tout roule !
Voici le bon code :
Code :
1. typedef struct
2. {
3. int idEmploye;
4. char nom[100];
5. char prenom[100];
6. int nbrKmEmploye;
7. }Employe;
8.
9.
10.
11. Employe tabEmploye[100];
12.
13.
14. void main ()
15. {
16. int i;
17.
18. FILE *fichier1;
19. fichier1=fopen("employés.txt","r" );
20.
21. if(fichier1!=NULL)
22. {
23. for (i=1; i<100; i++)
24. {
25. if (getc(fichier1) != EOF)
26. {
27. fscanf(fichier1,"D;%d;%d;%s %s\n",&tabEmploye[i].idEmploye, &tabEmploye[i].nbrKmEmploye, tabEmploye[i].nom, tabEmploye[i].prenom);
28.
29.
30. printf("\n..%d..%d..%s..%s..", tabEmploye[i].idEmploye, tabEmploye[i].nbrKmEmploye, tabEmploye[i].nom, tabEmploye[i].prenom);
31. system("PAUSE" );
32. }
33. }
34. }
35. fclose(fichier1);
36.
37.
38. }
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..
Bonne soirée
A noté que quand je fait des fprintf avec pour rentrer tout les données juste avant mes fscanf ca marche parfaitement bien ...
Par contre quand je fait que de la lecture au début (donc sans écriture juste avant) ca ne marque plus et j'ai des valeures abhérantes !
Par contre quand je fait que de la lecture au début (donc sans écriture juste avant) ca ne marque plus et j'ai des valeures abhérantes !
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
23 janv. 2010 à 23:27
23 janv. 2010 à 23:27
Je ne vois pas d'erreurs dans ton programme mais je ne dis pas qu'il n'y en ait pas.
Toutefois, à moins que ce soit un exercice de style, je n'utiliserais pas le couple 'fseek/fscanf'. Pourquoi ? Il y a 2 raisons:
- lire des chaînes avec des 'scanf' est terriblement dangereux et devrait être proscrit comme des 'gets',
- utiliser des 'fseek' pour sauter les fins de chaîne pose 2 problèmes: dépend du système d'exploitation (1 caractère sous Linux et 2 sous Windows) et ne permet pas une resynchronisation s'il y a une erreur dans une des lignes du fichier.
Ce sont pour ces raisons que j'utiliserais plutôt le couple fgets/strchr:
- 'fgets' pour lire une ligne entière,
- 'strchr' pour découper la ligne en différents champs.
Nota: 2 petits détails:
FILE *fichier1=fopen("véhicules.txt","r");
if(fichier1==NULL)
fclose(fichier1);
Il est absurde de fermer un fichier ... qui n'a pas pu être ouvert ;-)
Il vaut mieux avoir la structure suivante:
for (i=1; i<100; i++)
Pour remplir raisonnablement le tableau, l'indice 'i' doit aller de '0' à '<100'.
Bonne continuation.
Toutefois, à moins que ce soit un exercice de style, je n'utiliserais pas le couple 'fseek/fscanf'. Pourquoi ? Il y a 2 raisons:
- lire des chaînes avec des 'scanf' est terriblement dangereux et devrait être proscrit comme des 'gets',
- utiliser des 'fseek' pour sauter les fins de chaîne pose 2 problèmes: dépend du système d'exploitation (1 caractère sous Linux et 2 sous Windows) et ne permet pas une resynchronisation s'il y a une erreur dans une des lignes du fichier.
Ce sont pour ces raisons que j'utiliserais plutôt le couple fgets/strchr:
- 'fgets' pour lire une ligne entière,
- 'strchr' pour découper la ligne en différents champs.
Nota: 2 petits détails:
FILE *fichier1=fopen("véhicules.txt","r");
if(fichier1==NULL)
fclose(fichier1);
Il est absurde de fermer un fichier ... qui n'a pas pu être ouvert ;-)
Il vaut mieux avoir la structure suivante:
FILE* fichier1 = fopen("véhicules.txt", "r"); if (fichier1) { ... fclose(fichier1); }char tampon[100];
for (i=1; i<100; i++)
Pour remplir raisonnablement le tableau, l'indice 'i' doit aller de '0' à '<100'.
Bonne continuation.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
24 janv. 2010 à 01:19
24 janv. 2010 à 01:19
Hello,
- utiliser des 'fseek' pour sauter les fins de chaîne pose 2 problèmes: dépend du système d'exploitation (1 caractère sous Linux et 2 sous Windows)
Non. A moins d'ouvrir le fichier en binaire, en C le retour chariot sera '\n' quelque soit le système d'exploitation. fseek n'a donc aucun problème pour "sauter les fins de chaîne".
Cdlt,
- utiliser des 'fseek' pour sauter les fins de chaîne pose 2 problèmes: dépend du système d'exploitation (1 caractère sous Linux et 2 sous Windows)
Non. A moins d'ouvrir le fichier en binaire, en C le retour chariot sera '\n' quelque soit le système d'exploitation. fseek n'a donc aucun problème pour "sauter les fins de chaîne".
Cdlt,
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
24 janv. 2010 à 03:12
24 janv. 2010 à 03:12
Sous Windows, je ne sais comment cela se passe.
Sous Linux, le mode 'texte' n'existe pas; tout fichier est donc ouvert en mode binaire. J'ai été obligé de faire des essais car il y a bien longtemps que je ne me suis pas préoccupé de ce problème. Voici mes observations avec un fichier contenant des '0A' et des '0D'.
- La fonction 'fseek' ne fait aucune différence entre les octets, il les compte tous,
- La fonction 'fgets' s'arrête bien aux '0A' et les laisse dans la chaîne, d'autre part elle considère le '0D' comme un caractère et le laisse donc aussi dans la chaîne; par contre, seul le '0A' sert de délimiteur de ligne.
Finalement il n'y a rien d'étonnant puisque le fichier est ouvert en binaire; le problème c'est qu'il s'agit du seul mode existant. Personnellement, je trouve cela plus simple.
Bonne nuit.
Sous Linux, le mode 'texte' n'existe pas; tout fichier est donc ouvert en mode binaire. J'ai été obligé de faire des essais car il y a bien longtemps que je ne me suis pas préoccupé de ce problème. Voici mes observations avec un fichier contenant des '0A' et des '0D'.
- La fonction 'fseek' ne fait aucune différence entre les octets, il les compte tous,
- La fonction 'fgets' s'arrête bien aux '0A' et les laisse dans la chaîne, d'autre part elle considère le '0D' comme un caractère et le laisse donc aussi dans la chaîne; par contre, seul le '0A' sert de délimiteur de ligne.
Finalement il n'y a rien d'étonnant puisque le fichier est ouvert en binaire; le problème c'est qu'il s'agit du seul mode existant. Personnellement, je trouve cela plus simple.
Bonne nuit.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
24 janv. 2010 à 08:16
24 janv. 2010 à 08:16
Sous Linux, le mode 'texte' n'existe pas; tout fichier est donc ouvert en mode binaire
Oui mais comme sous Linux le retour chariot est '\n' comme en C, cela ne pose absolument aucun soucis.
En revanche sous windows, l'ouverture du fichier en mode binaire et en mode texte aura une incidence sur la gestion des retours chariots. "\r\n" transformé en "\n" en lecture et inversement en écriture.
Il n'y a donc aucun problème d'utilisation de fseek et c'est heureux.
Oui mais comme sous Linux le retour chariot est '\n' comme en C, cela ne pose absolument aucun soucis.
En revanche sous windows, l'ouverture du fichier en mode binaire et en mode texte aura une incidence sur la gestion des retours chariots. "\r\n" transformé en "\n" en lecture et inversement en écriture.
Il n'y a donc aucun problème d'utilisation de fseek et c'est heureux.