modifier une ligne precise d'un fichier texte

modifier une ligne precise d'un fichier texte - C - Programmation

Marsh Posté le 04-07-2010 à 16:45:24    

bonjour a tous depuis hier j'essaie de modifier un fichier a une ligne precise, je m'explique :
j'ai un fichier structuré de cette facon : une ligne avec le nom d'un spectacle et la suivante avec le nombre de place dipsonibles pour ce spectacle je souhaite modifier le nombre de place pour un spectacle precis , je connais le nombre de ligne ainsi que la ligne que je souhaite modifier j'utilise fgets pour me deplacer dans le fichier et fputs pour ecrire à la ligne souhaité voici ma fonction mon probleme est que celle ci n'ecrit rien dans le fichier :
 

Code :
  1. int test_spect(int num_spect,int nbre_place,char *place[20]){
  2. int a;char line[256];char* place_final;
  3.     printf("%s",place[num_spect]);
  4.     int init_place=atoi(place[num_spect]);
  5.      printf("nombre de place initiale :%d",init_place);
  6.                  printf("SPECTACLE initiale :%d",num_spect);
  7.      if(init_place>=nbre_place){
  8.      int place_rest=init_place-nbre_place;
  9.      printf("nombre de place restante :%d",place_rest);
  10.      F1 = fopen("toto.txt","r+" ); //ouverture en lecture/ecriture
  11.          if(F1==NULL){
  12.           fprintf(stderr,"Impossible d'ouvrir le fichier \n" );
  13.               }
  14.           printf("............ Ouverture du fichier \n" );
  15.            printf("bloque a" );
  16.           for(a=1;a<num_spect;a++){
  17.            fgets(line,256,F1);
  18.            fgets(line,256,F1);
  19.           }
  20.       fgets(line,256,F1);
  21.       place_final=malloc(sizeof(place_rest));
  22.       sprintf(place_final,"%d",place_rest);
  23.       printf("nouvelle valeure %s\n",place_final);
  24.       fputs(place_final,F1);
  25.       printf("ecriture fichier reussie\n" );
  26.       return 1;
  27.        }
  28.      else return 2;
  29.       /*fermeture du fichier*/
  30.       if(fclose(F1)==EOF){
  31.       fprintf(stderr,"Probleme de fermeture du fichier \n" );
  32.       exit(1);
  33.       printf(".................... fermeture du fichier \n" );
  34.         }
  35. exit(0);
  36.    }


 
Voila ma fonction j'ai mis pas mal de printf pour essayer de reperé ou ca blouqe mais apperment il effectue toute la fonction mais ne modifie rien au fichier.

Reply

Marsh Posté le 04-07-2010 à 16:45:24   

Reply

Marsh Posté le 04-07-2010 à 23:03:51    

Ce qu'il faut bien comprendre, c'est qu'un fichier c'est rien d'autre qu'une suite d'octets sur disque. Faut absolument que tu t'habitues à te représenter ton fichier non pas en nombre de lignes mais en caractères.
 
Donc si tu veux remplacer n caractères par n autres à partir de la position p, il te suffit de
- te déplacer sur la position p en utilisant fseek()
- écrire les n nouveaux caractères qui viendront remplacer les n autres
 
Maintenant si tu veux remplacer n caractères par m autres à partir de la position p, que m soit plus petit ou plus grand que n ta seule solution est
- recopier dans un second fichier les p premiers caractères du premier fichier
- écrire ensuite les m autres
- te déplacer dans le premier fichier de n caractères
- recopier enfin dans le second fichier les caractères restants du premier fichier
 
Accessoirement, tu quittes la fonction aux return sans avoir fermé ton fichier (écriture non finalisée => le fichier est écrit logiquement mais pas forcément physiquement sur le disque). De plus, tu quittes (encore ???) ta fonction (et le programme) par des exit ce qui est très mal. Seule la fonction main() est autorisée à utiliser exit. Pour les autres, c'est comme des poupées russes. Toute fonction appelée doit revenir à l'appelant. S'il y a un problème elle transmet le problème à l'appelant qui, si c'est le main, prendra une décision ou transmettra le problème à son propre appelant etc etc jusqu'au main.


Message édité par Sve@r le 04-07-2010 à 23:06:45

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 07-07-2010 à 00:16:18    

Merci de ton aide en fin de compte j'ai optez pour la reecriture complete du fichier qui marche bien par contre sur un autre bout de code j'utilise un thread avec une fonction qui doit me renvoyer un int comment puis je recuperer cette valeur ?
mon code est de ce type :  
if(pthread_create(&num_thread,NULL,(void *(*)())test_spect,NULL)==-1)
 
c'est la fonction test_spect qui me retourne un int que je ne sais pas comment recuperer .
merci de ton aide

Reply

Marsh Posté le 08-07-2010 à 18:35:44    

zdarbilo a écrit :

Merci de ton aide en fin de compte j'ai optez pour la reecriture complete du fichier qui marche bien par contre sur un autre bout de code j'utilise un thread avec une fonction qui doit me renvoyer un int comment puis je recuperer cette valeur ?
mon code est de ce type :  
if(pthread_create(&num_thread,NULL,(void *(*)())test_spect,NULL)==-1)
 
c'est la fonction test_spect qui me retourne un int que je ne sais pas comment recuperer .
merci de ton aide


 
 
La fonction pthread_join te permet d'attendre la fin de ton thread créé par pthread_create (fin de thread = terminaison de la fonction, ou bien un pthread_exit dans la fonction de thread).
 
Le 2nd paramètre de pthread_join te permet de récupérer la valeur de retour de ta fonction.

Reply

Sujets relatifs:

Leave a Replay

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