Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1582 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Comment sauvegarder lors d'un remplissage de fichier?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Comment sauvegarder lors d'un remplissage de fichier?

n°2205965
ludoztw
Posté le 08-10-2013 à 20:22:20  profilanswer
 

Bonsoir à tous & merci de votre aide :)
 
J'ai un TP à réaliser en programmation, il m'est demandé de saisir et de remplir un fichier des données que je dois rentré.
Mon problème est que lorsque j'inscris mes valeurs, elles écrasent mes précédentes, je voudrais qu'elles se rajoutent à la suite de mon fichier.
 
Voici mon code :  
 

Code :
  1. void Deplacement(void)
  2. {
  3.     FILE * f;
  4.     f = fopen("deplac.don", "w" );
  5.     int numero, jdep, jarrive, codeLieu, numero2;
  6.     /*if(f == NULL)
  7.     {
  8.         printf("Le fichier ne contient aucune information!" )
  9.         exit(1)
  10.     }*/
  11.     printf("Numéro de l'employe | 0 pour arrêter : \n" );
  12.     scanf("%d",&numero);
  13.     while (numero != 0)
  14.     {
  15.         printf("Numero de jour de depart : \n" );
  16.         scanf("%d",&jdep);
  17.         printf("Numero de jour d'arrive : \n" );
  18.         scanf("%d",&jarrive);
  19.         printf("Le lieu de deplacement (1:Paris | 2:Autres Villes) : \n" );
  20.         scanf("%d",&codeLieu);
  21.         fprintf(f, "%d  %d  %d  %d\n",numero, jdep, jarrive, codeLieu);
  22.         printf("Numero de l'employe | 0 pour arrêter : \n" );
  23.         scanf("%d",&numero);
  24.     }


 
Merci de votre aide :)

mood
Publicité
Posté le 08-10-2013 à 20:22:20  profilanswer
 

n°2205967
Profil sup​primé
Posté le 08-10-2013 à 20:26:27  answer
 

T'as pas un mode "append" au lieu de w je pense pour "Write" à donner à fopen ?

n°2205968
ludoztw
Posté le 08-10-2013 à 20:35:14  profilanswer
 


 
EXAAAAAACT ! :) Merci beaucoup ;)
 
En revanche je dois maintenant réaliser une fonction permettant d'extraire les déplacements de cet employé.  
 
J'ai donc créé la fonction suivante :
 

Code :
  1. printf("Saisir le numero de l'employe :" );
  2. scanf("%d",&numero2);
  3. if (numero2 == numero)
  4. {
  5.       fscanf(f, "%d %d %d %d", &numero, &jdep, &jarrive, &codeLieu);
  6.       printf("Les informations concernant cet employé : %d, %d et %d", jdep, jarrive, codeLieu, numero);
  7. }


 
Le problème est que je dois mettre 0 pour arrêter la fonction précédente, et qu'aucun employé n'est donc trouvé..
 
Merci de votre aide :)

n°2205970
Profil sup​primé
Posté le 08-10-2013 à 20:37:13  answer
 

C'est un autre problème, et j'ai pas compris la question.

n°2205972
Profil sup​primé
Posté le 08-10-2013 à 20:42:17  answer
 

A ouais, j'ai pigé.
 
 
Tu peux pas procéder comme tu a fait puisque numéro vaut 0 avant que tu lise numéro dans le fichier.
 
Tu dois d'abord lire numéro pour le comparer à numéro2 et afficher s'il sont égau.

n°2205973
ludoztw
Posté le 08-10-2013 à 20:42:17  profilanswer
 

En fait, je dois créé une fonction permettant de saisir le numéro de l'employé, le programme doit ensuite renvoyer les  3 autres informations correspondantes (Jour de départ, Jour d'arrivé, Code Lieu).

n°2205974
ludoztw
Posté le 08-10-2013 à 20:45:18  profilanswer
 

Je ne vois pas comment tu veux procéder, si tu pouvais me donner un petit coup de pouce, ce serait sympa :)

n°2205975
Profil sup​primé
Posté le 08-10-2013 à 20:53:30  answer
 

ludoztw a écrit :

Je ne vois pas comment tu veux procéder, si tu pouvais me donner un petit coup de pouce, ce serait sympa :)


 
 
Tu dois faire une boucle qui affiche tous les enregistrement pour un employé.


Dans une boucle
  lire enregistrement
  si enregistrement.numero = numero2  
    afficher enregistrement
  fin si
  sortir quand fin de fichier
fin de boucle.


Message édité par Profil supprimé le 08-10-2013 à 20:56:55
n°2205988
ludoztw
Posté le 08-10-2013 à 21:48:41  profilanswer
 

Ah ouais, merci de ton aide, j'essaie :)

n°2206000
ludoztw
Posté le 08-10-2013 à 23:43:26  profilanswer
 

Comment faut-il faire pour commencer la boucle ? While?
 
Et comment lire l'enregistrement? Grâce au fscanf?  
 
Merci :)

mood
Publicité
Posté le 08-10-2013 à 23:43:26  profilanswer
 

n°2206002
Profil sup​primé
Posté le 09-10-2013 à 00:15:39  answer
 

Je ne sais pas, je vais voir.
Ca doit être une question de documentation.

n°2206003
Profil sup​primé
Posté le 09-10-2013 à 00:47:55  answer
 

T'as terminé ?
 
J'espère...
 
 
Voici le code dans le même esprit, n'oublie pas de fermer le fichier à la fin de l'utilisation.
 

Code :
  1. void List(void)
  2. {
  3.  int numero2;
  4.  printf("Numéro de l'employe | 0 pour arrêter : \n" );
  5.  scanf("%d",&numero2);
  6.  while (numero2 != 0)
  7.    {
  8.      FILE * f;
  9.      f = fopen("deplac.don", "r" );
  10.      int numero, jdep, jarrive, codeLieu;
  11.      if(f == NULL)
  12.        {
  13.          printf("Le fichier ne contient aucune information!" );
  14.        };
  15.  
  16.      while (!feof(f))
  17.        {
  18.          fscanf(f, "%d %d %d %d", &numero, &jdep, &jarrive, &codeLieu);
  19.          if (numero == numero2)
  20.            {
  21.              printf("Numero de jour de depart : %d\n", jdep);
  22.  
  23.              printf("Numero de jour d'arrive : %d\n", jarrive);
  24.  
  25.              printf("Le lieu de deplacement (1:Paris | 2:Autres Villes) : %d\n", codeLieu);
  26.  
  27.            }
  28.        }
  29.      fclose(f);
  30.      printf("Numero de l'employe | 0 pour arrêter : \n" );
  31.      scanf("%d",&numero2);
  32.    }
  33.  
  34. }

Message cité 1 fois
Message édité par Profil supprimé le 09-10-2013 à 00:48:12
n°2206009
Sve@r
Posté le 09-10-2013 à 09:02:28  profilanswer
 

ludoztw a écrit :

Comment faut-il faire pour commencer la boucle ? While?


Bonjour

Code :
  1. while (lecture(fichier)) != valeur_spéciale_renvoyée_par_la_fonction_de_lecture_quand_fin_fichier_atteinte)
  2. {
  3.    ....
  4. }


 

ludoztw a écrit :

Et comment lire l'enregistrement? Grâce au fscanf?


T'as plusieurs méthodes. Si ton fichier est écrit en lignes (typiquement un fichier texte) tu peux utiliser fgets(). Si tu dois lire des octets tu peux utiliser fgetc() ou fread(). Si tu as des enregistrements bien formatés tu peux alors utiliser fscanf()....
 
 
Non. feof() ne sert pas à ça et ne s'utilise pas de cette manière.
feof() sert, une fois que le fichier a été entièrement lu et que la fonction de lecture renvoie la valeur spéciale mentionnée plus haut, à indiquer si la lecture ne se fait plus à cause de la fin de fichier ou pour un autre raison (une erreur, etc). Il ne sert pas à arrêter une boucle de lecture car la boucle s'arrête, certes, mais un coup trop tard et le traitement est fait une fois de trop. Ou alors on teste fscanf() mais alors cela revient à écrire

Code :
  1. while (fscanf(...) != 0)
  2. {
  3.    traitement;
  4. }

ce qui est la méthode habituelle de lecture d'un fichier
 
 
 
Non, si f est null ce n'est pas parce que le fichier ne contient aucune information mais c'est qu'il y a eu un problème à l'ouverture. Parce que, même vide, un fopen() qui fonctionne ne retourne pas NULL
Sinon c'est dommage de dédoubler les instructions de saisies du n°. C'est plus pratique (voire même plus élégant) d'écrire ceci

Code :
  1. while (1)
  2. {
  3.  printf("Numéro de l'employe | 0 pour arrêter : \n" );
  4.  scanf("%d",&numero2);
  5.  if (numero2 == 0) break;
  6.  
  7.  f = fopen("deplac.don", "r" );
  8.  if (f == NULL)
  9.  {
  10.        printf("erreur d'ouverture - %s\n", strerror(errno));
  11.        continue;
  12.   }
  13.    
  14.  while (fscanf(...))
  15.  {
  16.      ...
  17.  }
  18. }


...


Message édité par Sve@r le 09-10-2013 à 09:31:37

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2206031
Profil sup​primé
Posté le 09-10-2013 à 11:19:19  answer
 

Quand tu dis feof ne sert pas à ça. Tu penses à quoi ?

Message cité 1 fois
Message édité par Profil supprimé le 09-10-2013 à 11:19:53
n°2206065
Sve@r
Posté le 09-10-2013 à 14:50:40  profilanswer
 


Je pense à la façon dont tu t'en sers, pour arrêter le traitement. Parce que feof ne sert pas à arrêter une boucle de lecture+traitement. Parce que dans ce cas, le traitement est fait une fois de plus que le nombre d'informations réelles que contient le fichier. Parce que, quand ton programme lit la dernière info du fichier, celle-ci est traitée mais tu n'as pas encore atteint la fin de fichier. Et donc, à l'itération suivante, feof() renvoie toujours 0. Donc tu fais alors une lecture supplémentaire qui ne lit plus rien mais comme tu ne la testes pas, tu fais quand-même le traitement associé.
 
Exemple: crées un fichier contenant ces 3 lignes

Code :
  1. toto
  2. titi
  3. tata


 
Et testes le code suivant

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.     FILE *fp;
  7.     int i=0;
  8.     char ligne[80];
  9.     char *pt;
  10.  
  11.     fp=fopen("fic", "r" );
  12.     while (!feof(fp))
  13.     {
  14.         fgets(ligne, 80, fp);
  15.  
  16.         // Juste pour supprimer le '\n' de la ligne - Cela ne change rien à l'exemple mais rend l'affichage plus clair
  17.         if ((pt=strchr(ligne, '\n')) != NULL)
  18.             *pt='\0';
  19.  
  20.         i++;
  21.         printf("ligne %d - J'ai lu [%s]\n", i , ligne);
  22.     }
  23.     fclose(fp);
  24. }


 
Tu auras comme résultat

Code :
  1. ligne 1 - J'ai lu [toto]
  2. ligne 2 - J'ai lu [titi]
  3. ligne 3 - j'ai lu [tata]
  4. ligne 4 - j'ai lu [tata]


Le texte affiché entre les crochets de la 4° ligne pourra être différent selon le compilateur et l'os mais une chose est certaine, c'est que tu auras un printf() de plus que le nombre réel de lignes parce qu'à la fin de la dernière ligne lue, feof() n'est pas activé.
 
Une solution est alors de tester si fgets() a renvoyé NULL (ce qui se passe à la 4° lecture) et quitter la boucle si c'est le cas mais cela amène alors rapidement la conclusion logique que feof() ne sert à rien ici et que la fin de fichier peut tout aussi bien être détectée via fgets() (ou toute autre fonction de lecture).
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.     FILE *fp;
  7.     int i=0;
  8.     char ligne[80];
  9.     char *pt;
  10.     fp=fopen("fic", "r" );
  11.     while (fgets(ligne, 80 ,fp) != NULL)
  12.     {
  13.         // Juste pour supprimer le '\n' de la ligne - Cela ne change rien à l'exemple mais rend l'affichage plus clair
  14.         if ((pt=strchr(ligne, '\n')) != NULL)
  15.             *pt='\0';
  16.  
  17.         i++;
  18.         printf("ligne %d - J'ai lu [%s]\n", i , ligne);
  19.     }
  20.  
  21.     fclose(fp);
  22. }


 
Ensuite, après la boucle, on peut si on veut utiliser feof() pour indiquer si tout le fichier a été lu ou bien si la lecture a été interrompue avant la fin (à cause par exemple d'une erreur IO)
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.     FILE *fp;
  7.     int i=0;
  8.     char ligne[80];
  9.     char *pt;
  10.     fp=fopen("fic", "r" );
  11.     while (fgets(ligne, 80 ,fp) != NULL)
  12.     {
  13.         // Juste pour supprimer le '\n' de la ligne - Cela ne change rien à l'exemple mais rend l'affichage plus clair
  14.         if ((pt=strchr(ligne, '\n')) != NULL)
  15.             *pt='\0';
  16.  
  17.         i++;
  18.         printf("ligne %d - J'ai lu [%s]\n", i , ligne);
  19.     }
  20.  
  21.     if (feof(fp))
  22.         printf("Tout le fichier a été traité et il contient %d lignes\n", i);
  23.     else
  24.         printf("Lecture interrompue ligne %d - Il y a peut-être encore des infos non traitées\n", i);
  25.  
  26.     fclose(fp);
  27. }


Message édité par Sve@r le 09-10-2013 à 15:14:33

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°2206081
Profil sup​primé
Posté le 09-10-2013 à 16:33:20  answer
 

Merci Sve@r, désolé d'avoir introduit une erreur, comme feof est utilisé ainsi dans plusieurs exemple du net, j'ai copié.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Comment sauvegarder lors d'un remplissage de fichier?

 

Sujets relatifs
Inversion de matrices en C[C=débutant] Boucle While
Débutant en C...[PHP] Script de remplissage de base de données
Comment générer un nombre aléatoire en C++ ?vérifier si un fichier a été modifié
Configurer les registres d'un PIC18F en Cfichier audio grâce à formulaire Access et Media Player
Resoudre une equation du second degre en C (suite)Patrons pour détecter les titres et les sous tires d'un fichier texte
Plus de sujets relatifs à : [C] Comment sauvegarder lors d'un remplissage de fichier?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR