Se connecter / S'enregistrer
Votre question

Lecture d'un fichier binaire en C

Tags :
  • Fichier
  • Programmation
Dernière réponse : dans Programmation
14 Janvier 2013 19:15:23

Bonsoir. Je suis entrain de réaliser une fiche étudiant. Je suis parvenu à écrire dans un fichier le tableau de structure mais quand je veux le récupérer dans un autre tableau pour le traitement, les informations ne sont pas complètes. Merci d'avance



//Ci-dessous la procédure qui permet de recueillir les informations entrées par l'utilisateur
  1. int input(Eleve eleve[])
  2. {
  3. int i = 0, choice = 0;
  4. do{
  5. if(choice == 2)
  6. break;
  7. system("cls");
  8. printf("ETUDIANT %d\n\n", i+1);
  9.  
  10. printf(" SECTION A \n");
  11. printf("INFORMATIONS PERSONNELLES\n\n");
  12.  
  13. printf("Nom\n\n");
  14. fflush(stdin);
  15. fgets(eleve[i].nom, sizeof eleve[i].nom, stdin);
  16. search(eleve[i].nom);
  17. /* ............................................
  18. ..................................*/
  19. system("cls");
  20.  
  21. i++;
  22.  
  23. do{
  24. printf("\n\nCONTINUER LA SAISIE ====> 1\n");
  25. printf("QUITTER LA FENETRE DE SAISIE ====> 2\n\n");
  26. receive(&choice);
  27. }while(choice != 1 && choice != 2);
  28.  
  29. }while(choice == 1);
  30.  
  31. FILE *fichier = fopen("base.bin", "ab");
  32. if(fichier == NULL)
  33. exit(EXIT_FAILURE);
  34.  
  35. fwrite(eleve, i*sizeof(eleve), 1, fichier);
  36. fclose(fichier);
  37.  
  38. system("cls");
  39.  
  40. return i;
  41. }

//Ci-dessous la procédure qui permet de recueillir les informations contenues dans le fichier externe
  1. void output(Eleve eleve[], int n)
  2. {
  3. FILE *fichier = fopen("base.bin", "rb");
  4. if(fichier == NULL)
  5. exit(EXIT_FAILURE);
  6.  
  7. fread(eleve, n * sizeof(eleve), 1, fichier);
  8. printf("%s %s a %d ans\n", eleve[0].nom, eleve[0].prenom, eleve[0].age);//Cette ligne me permet de voir le résultat de la lecture et c'est elle qui m'indique qu'il y a un problème puisque seuls les 4 premiers caractères du nom sont affichés.
  9. fclose(fichier);
  10. system("PAUSE");
  11. }

Autres pages sur : lecture fichier binaire

23 Janvier 2013 13:47:43

Salut,

J'avais eu à faire à peu près la même chose une fois. Voici mon code qui fonctionne très bien.
Analyse le, teste le et compare le au tien: (j'y ai laissé les consignes qui m'étaient posées ainsi que mes commentaires)
En espérant que ça t'aide..

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. /*
  7. On souhaite gerer un carnet d'adresses en s'appuyant sur un fichier dans lequel
  8. les coordonnees des differents contacts seront stockees.
  9. Pour chaque contact, on souhaite stocker :
  10. - le Nom, sur 20 caracteres maximum,
  11. - le Prenom, sur 20 caracteres maximum,
  12. - l'age, sous forme d'un long.
  13. Q-5.3.1 : Ecrivez le type contact pour qu'il corresponde bien a la description ci-dessus.
  14. Q-5.3.2 : Ecrivez une fonction main realisant le travail prealable d'ouverture d'un fichier dans le bon mode pour cette application.
  15. Q-5.3.3 : Ecrivez une fonction permettant de faire la saisie d'un contact et de la stocker à la fin du des contacts supposé déjà ouvert.
  16. Q-5.3.4 : Ecrivez une fonction permettant dafficher un contact charger a partir du fichier suppose deja ouvert.
  17. On supposera aussi que le curseur sur le fichie est correctement place au debut d'une fiche
  18.  
  19.  
  20.  
  21. */
  22. typedef struct { char nom[20]; char prenom[20]; long age; }contact;
  23. void saisie(contact* personne);
  24. void sauver(contact* personne, FILE* fichier_cible);
  25. void charger(contact* personne, FILE* fichier_cible);
  26. void afficher(contact * personne);
  27.  
  28. int main()
  29. {
  30. int mode=0, choix;
  31. /*
  32. Ouverture de fichier en a+ :
  33. - Ouverture du Fichier en Lecture/Ecriture.
  34. - N'efface pas le fichier existant s'il y en a un.
  35. - Le fichier est cree s'il n'existe pas.
  36. */
  37. char fileName[] = "contact.txt";
  38. FILE* data = fopen(fileName,"r");
  39. if(data == NULL) {data = fopen(fileName,"w"); fclose(data);}
  40. data = fopen(fileName,"r+");
  41. if(data == NULL) {printf("Impossible de lire ou écrire le fichier des contacts. Ce programme se termine maintenant.\n");exit(0);}
  42.  
  43. contact personne; // on creer une fiche de type contact
  44.  
  45. while(mode!=(-1))
  46. {
  47. while(mode==0 || (mode!=1 && mode!=2 && mode!=3 && mode!=4) )
  48. {
  49. printf("\n-------- MENU PRINCIPAL --------\n\tliste des menus:\n");
  50. printf("\t1 => creer un nouveau contact\n");
  51. printf("\t2 => sauver le contact en cours\n");
  52. printf("\t3 => charger un contact\n");
  53. printf("\t4 => afficher le contact en cours\n");
  54. printf("\tTapez votre choix ici: ");
  55. scanf("%d", &mode);
  56. }
  57.  
  58. while(mode==1)
  59. {
  60. saisie(&personne); /* on creer un contact */
  61. printf("\n\tVoulez-vous sauvegardez ce contact ?\t1=> oui\n\tTapez votre reponse ici: ");
  62. scanf("%d",&choix);
  63. if(choix==1) { mode=2; } else{ mode=0; }
  64. }
  65.  
  66. while(mode==2) {sauver(&personne, data); /* on sauvegarde un contact */ mode=0; }
  67.  
  68. while(mode==3)
  69. { fseek(data,0,SEEK_SET);
  70. charger(&personne, data); mode=0;
  71. printf("\n\tVoulez-vous afficher ce contact ?\t1=> oui\n\tTapez votre reponse ici: ");
  72. scanf("%d",&choix);
  73. if(choix==1) { mode=4; } else{ mode=0; }
  74. }
  75. while(mode==4) { afficher(&personne); mode=0; }
  76. }
  77.  
  78. return 0;
  79. }
  80.  
  81. void saisie(contact* personne)
  82. {
  83. char nom[20], prenom[20];
  84. long age;
  85.  
  86. printf("\n--------\nDEBUT SASIE DU NOUVEAU CONTACT\n\n\tDonner le nom de famille du nouveau contact: ");
  87. scanf("%s", nom);
  88. printf("\n\tDonner le prenom de %s: ", nom);
  89. scanf("%s",prenom);
  90. printf("\n\tDonner l'age de %s %s: ", nom, prenom);
  91. scanf("%ld",&age);
  92.  
  93. strcpy((*personne).nom,nom);
  94. strcpy((*personne).prenom,prenom);
  95. (*personne).age = age;
  96. printf("\nFIN SAISIE DU NOUVEAU CONTACT\n--------\n");
  97. }
  98.  
  99. void sauver(contact* personne, FILE* fichier_cible)
  100. {
  101. printf("\n--------\nDEBUT SAUVEGARDE DU CONTACT\n\n\touvertue du fichie cible ");
  102. /*
  103. Ouverture de fichier en a+ :
  104. - Ouverture du Fichier en Lecture/Ecriture.
  105. - N'efface pas le fichier existant s'il y en a un.
  106. - Le fichier est cree s'il n'existe pas.
  107. */
  108. printf("\n\tecriture des donnees");
  109. fseek(fichier_cible,0,SEEK_END);
  110. int a = fwrite(personne, sizeof(contact), 1, fichier_cible); // ecriture en mode binaire. 1=> ecrit a la premiere ligne
  111. fflush(fichier_cible);
  112. printf("\n\tsauvegarde terminee\n\nFIN SAUVEGARDE DU CONTACT\n--------\n");
  113. // fprintf(data, "\n\nNOUVELLE FICHE\n\tNom: %s\n\tPrenom: %s\n\tAge: %ld\n ", superman.nom, superman.prenom, superman.age); // mode texte
  114. }
  115.  
  116. void charger(contact* personne, FILE* fichier_cible)
  117. {
  118. printf("\n--------\nCHARGEMENT DU CONTACT");
  119. /*
  120. Cette fonction ecrit dans la variable personne qui lui est passe par adresse le contenu du fichier_cible
  121. Ce contenu pese extactement sizeof(contact)
  122. La lecture commence au cursor
  123. */
  124. fread(personne, sizeof(contact),1, fichier_cible);
  125. printf("\tOK\n--------\n");
  126. }
  127.  
  128. void afficher(contact * personne)
  129. {
  130. printf("\n--------\nDEBUT AFFICHAGE DU CONTACT\n");
  131. printf("\n\tNom: %s\n\tPrenom: %s\n\tAge: %ld ans", (*personne).nom, (*personne).prenom, (*personne).age);
  132. printf("\n\nFIN FIN AFFICHAGE DU CONTACT\n--------\n");
  133. }

m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS