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

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

Marsh Posté le 08-10-2013 à 20:22:20    

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 :)

Reply

Marsh Posté le 08-10-2013 à 20:22:20   

Reply

Marsh Posté le 08-10-2013 à 20:26:27    

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

Reply

Marsh Posté le 08-10-2013 à 20:35:14    


 
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 :)

Reply

Marsh Posté le 08-10-2013 à 20:37:13    

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

Reply

Marsh Posté le 08-10-2013 à 20:42:17    

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.

Reply

Marsh Posté le 08-10-2013 à 20:42:17    

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).

Reply

Marsh Posté le 08-10-2013 à 20:45:18    

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

Reply

Marsh Posté le 08-10-2013 à 20:53:30    

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
Reply

Marsh Posté le 08-10-2013 à 21:48:41    

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

Reply

Marsh Posté le 08-10-2013 à 23:43:26    

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

Reply

Marsh Posté le 08-10-2013 à 23:43:26   

Reply

Marsh Posté le 09-10-2013 à 00:15:39    

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

Reply

Marsh Posté le 09-10-2013 à 00:47:55    

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
Reply

Marsh Posté le 09-10-2013 à 09:02:28    

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.
Reply

Marsh Posté le 09-10-2013 à 11:19:19    

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
Reply

Marsh Posté le 09-10-2013 à 14:50:40    


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.
Reply

Marsh Posté le 09-10-2013 à 16:33:20    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed