IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Ouverture de fichier


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut Ouverture de fichier
    bonjour
    voila je voudrais ecrire dans mon fichier mais la ou je place mon curseur
    c'est a dire que je dois enregistrer un fichier de cette maniere
    begin:vcalendar
    begin:vevent
    ...
    end:vevent
    begin:vevent
    ...
    end:vevent
    begin:vevent
    ...
    end:vevent
    end:vcalendar
    en fait c'est la premiere et la derniere ligne qui m'embete, j'ai pensé a le creer et marquer ces lignes directement dans le fichier ensuite placer mon curseur de fichier a la fin du fichier, remonter d'une ligne et enregistrer ensuite ce que rentre l'utilisateur
    mon probleme c'est que si j'ouvre le fichier en 'a' il ecrit automatiquement a la fin il ne prend pas en compte le curseur et si je l'ouvre en 'w' il détruit automatiquement le fichier préexistant donc comment faire?
    merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Normal, pour écrire n'importe où dans le fichier sans rien écraser il faut travailler avec un fichier temporaire. Tu lis en fait le fichier d'origine et tu écrit dans le fichier temporaire ce que tu lis jusqu'à trouver l'endroit où tu veux faire la modification. Cette modification tu la fait dans le fichier temporaire et une fois celle-ci faite, tu lis le reste ligne par ligne que tu écrit dans le fichier temporaire.

    Pour finir, tu ferme les deux fichier et tu renomme le fichier temporaire avec le nom du fichier d'origine.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    si n'ai bien compris tu copie un fichier dans un nouveau fichier, peux tu faire un peit exemple pour mieux que je voye la fonction, dans le fichier d'origine du coup je peux utiliser un fseek pour lire et copier la chaine dans l'autre fichier c'est bien ca?
    merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    mon probleme est aussi sur comment copier un fichier dans un autre et ouvrir le fichier d'origine en quoi car au debut je l'ouvre en écriture j'écris dedans je le referme et plus loin je l'ouvre en lecture pour pouvoir utiliser un fseek , peut etre faut il mieux l'ouvrir en ecriture et en lecture mais le fseek marche t il toujours?
    voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    /*on écrit dans le fichier d'origine la forme que l'on veut*/
    /*on l'ouvre avec gestion des erreurs*/
    memoori=fopen("calend.txt","a");
     if (memoori==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
       /*on écrit la forme que l'on souhaite*/
       fprintf(memoori,"BEGIN:VCALENDAR\n");
       fprintf(memoori,"VERSION:1.0 PRODID :PalmDesktop Generated\n");
       fprintf(memoori,"END :VCALENDAR");
       fclose(memoori);
    /*ouverture du fichier d'origine en lecture pour récupérer les donner*/
    memoori=fopen("calend.txt","r");
     if (memoori==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
    //création d'une chaine de caractere
     chaine1 = calloc(81,sizeof(char));
     if (chaine1== NULL)
          exit(0);
    //création d'une chaine de caractere
     chaine2 = calloc(81,sizeof(char));
     if (chaine2== NULL)
          exit(0);
    /*Positionnement du curseur au début du fichier*/
    fseek(memoori,1,SEEK_SET);
    /*on récupère la première ligne du fichier*/
    fgets(chaine1,80,memoori);
     /*on passe à la ligne d'ne dessous*/
     fseek(memoori,1,SEEK_CUR);
    /*on récupère la première ligne du fichier*/
    fgets(chaine2,80,memoori); 
    /*ouverture du fichier memo (fichier temporaire en écriture */
       memo= fopen("memotemp.txt","a");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
     
    fprintf(memo,"%s",chaine1);
    fprintf(memo,"%s",chaine2);   
    fprintf(memo,"BEGIN:VEVENT\n"); 
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fprintf(memo,"DTSTART:");
    fprintf(memo,"%s%s%sT%d%s00Z\n",annee,tab1,jour,nbred,minutesd);
    fprintf(memo,"DTEND:");
    fprintf(memo,"%s%s%sT%d%s00Z\n",annee,tab1,jour,nbref,minutesf);
    fprintf(memo,"RRULE:");
    fprintf(memo,"%s",tab3);
    fprintf(memo," ");
    fprintf(memo,"%s",tab4);
    fprintf(memo," ");
    fprintf(memo,"%s%s%s\n",anneef,tab2,jourf);
    fprintf(memo,"END:VEVENT\n"); 
    /*tant que la fin du fichier n'est pas terminé*/
        while(!feof(memo))
         {
         strcpy(memoori,memo);
         }
    fclose(memo);
    fclose(memoori);
    bien evidemment le strcpy va pas car il se fait qu'avec des chaines mais que dois je mettre a la place? et est ce que la structure va bien, faut -il faire comme ca?
    merci

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    #define BEGIN     "begin:vcalendar"
    #define END       "end:vcalendar"
    #define TMP_FILE  "tmp_calend.txt"
    #define BUF_SIZE  50
     
     
    int main (void)
    {
       FILE *   p_src    = NULL;
       FILE *   p_dest   = NULL;
       char     buffer   [BUF_SIZE];
     
     
       p_src = fopen ("calend.txt", "r");
     
       if (p_src == NULL)
       {
          fprintf (stderr, "Impossible d'ouvrir le fichier \"calend.txt\"\n");
          exit (EXIT_FAILURE);
       }
     
       p_dest = fopen (TMP_FILE, "w");
     
       if (p_src == NULL)
       {
          fprintf (stderr, "Impossible d'ouvrir le fichier \"%s\"\n", TMP_FILE);
          exit (EXIT_FAILURE);
       }
     
     
       while ((fgets (buffer, BUF_SIZE, p_src)) != NULL)
       {
          /* On supprime le saut de ligne et on met un zero de fin. */
          {
             char * p = strchr (buffer, '\n');
     
             if (p != NULL)
             {
                *p = 0;
             }
          }
     
          if (strcmp (buffer, BEGIN) == 0)
          {
             fprintf (p_dest, "%s\n", buffer);
             fprintf (p_dest, "begin:vevent\n");
             fprintf (p_dest, "event\n");
             fprintf (p_dest, "end:vevent\n");
          }
          else
          {
             fprintf (p_dest, "%s\n", buffer);
          }
       }
     
     
       fclose (p_src);
       fclose (p_dest);
     
       remove ("calend.txt");
       rename (TMP_FILE, "calend.txt");
     
     
       return EXIT_SUCCESS;
    }
    Fichier "calend.txt" de départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    begin:vcalendar
    end:vcalendar
    Fichier "calend.txt" d'arrivée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin:vcalendar
    begin:vevent
    event
    end:vevent
    end:vcalendar
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Désolé pepsister, je vais également m'en servir. Je pense que la question qui va suivre, t'intéressera également

    Si on utilise ceci, l'écriture se fait juste après la ligne BEGIN :VCALENDAR. Comment faire pour que l'écriture se fasse juste avant END :VCALENDAR ?

    Ca conserve bien tous les éléments déjà présent dans le fichier texte mais ça décale deux lignes qui doivent rester tout en haut :

    VERSION :1.0
    PRODID : PalmDesktop Generated j'ai rajouté un espace après les deux points sur cette ligne ci mais il n'existe pas en réalité, c'est pour éviter un smiley
    Je cherche de mon côté mais si tu as une solution rapide

    EDIT : je viens de trouver une idée, remettre un test avec un compteur pour ces deux premières lignes.

  7. #7
    Membre averti
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Solution trouvée avec une boucle FOR. Merci Franck.h pour toute ton aide !

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    La solution la plus simple et rapide, du moins pour moi, serait de calculer le nombre de lignes dans le fichier, la dernière étant la balise de fermeture du calendrier puis une fois le nombre trouvé, de parcourir le fichier ligne par ligne jusqu'à tomber sur la ligne - 1 puis tu insère tes données et tu met ta balise de fermeture

    Une fonction possible pour la recherche du nombre de lignes (mais pas la plus rapide en temps d'exécution par contre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    int c_file_nb_lines (char const * const s_filename)
    {
       FILE *   p_file   = NULL;
       char     s_line     [BUFSIZ];
       int      nb_lines = 0;
     
     
     
       p_file = fopen (s_filename, "r");
     
     
       if (!p_file)
       {
          return -1;
       }
     
     
     
       while (fgets (s_line, BUFSIZ, p_file))
       {
          if (s_line [strlen (s_line) - 1] == '\n')
          {
             nb_lines++;
          }
       }
     
     
     
       if (ferror (p_file))
       {
          fclose (p_file);
          return -1;
       }
     
     
     
       fclose (p_file);
     
       return nb_lines;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre averti
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
             for (nl=0;nl<2;nl++){
                 fgets (buffer, BUF_SIZE, fp);        
                 fprintf (p_dest, "%s", buffer);
                 }
    J'ai rajouté ça après ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          if (strcmp (buffer, BEGIN) == 0)
          {  
             fprintf (p_dest, "%s\n", buffer);
    Et ça donne le bon résultat C'est peut-être un peu trop de la bidouille mais bon ça marche

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Une autre fonction de calcul du nombre de lignes dans un fichier, sans doute plus rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    size_t nb_lines (const char * s_filename)
    {
       size_t size = 0;
       FILE * p_file = fopen (s_filename, "r");
     
       if (p_file != NULL)
       {
          char c;
     
          while ((c = fgetc (p_file)) != EOF)
          {
             if (c == '\n')
             {
                size++;
             }
          }
     
          fclose (p_file);
       }
     
       return size;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Voici comment ca pourrais se passer ainsi, donc mon programme modifié deviens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    #define BEGIN     "begin:vcalendar"
    #define END       "end:vcalendar"
    #define TMP_FILE  "tmp_calend.txt"
    #define BUF_SIZE  50
     
     
    size_t nb_lines (const char * s_filename)
    {
       size_t size = 0;
       FILE * p_file = fopen (s_filename, "r");
     
       if (p_file != NULL)
       {
          char c;
     
          while ((c = fgetc (p_file)) != EOF)
          {
             if (c == '\n')
             {
                size++;
             }
          }
     
          fclose (p_file);
       }
     
       return size;
    }
     
     
    int main (void)
    {
       FILE *   p_src    = NULL;
       FILE *   p_dest   = NULL;
       char     buffer   [BUF_SIZE];
       size_t   lines    = 0;
       size_t   i        = 0;
     
     
       lines = nb_lines ("calend.txt");
     
       p_src = fopen ("calend.txt", "r");
     
       if (p_src == NULL)
       {
          fprintf (stderr, "Impossible d'ouvrir le fichier \"calend.txt\"\n");
          exit (EXIT_FAILURE);
       }
     
       p_dest = fopen (TMP_FILE, "w");
     
       if (p_src == NULL)
       {
          fprintf (stderr, "Impossible d'ouvrir le fichier \"%s\"\n", TMP_FILE);
          exit (EXIT_FAILURE);
       }
     
     
       while ((fgets (buffer, BUF_SIZE, p_src)) != NULL)
       {
          if (i < lines - 1)
          {
             fprintf (p_dest, "%s", buffer);
          }
          else
          {
             fprintf (p_dest, "begin:vevent\n");
             fprintf (p_dest, "event2\n");
             fprintf (p_dest, "end:vevent\n");
             fprintf (p_dest, "%s", END);
             break;
          }
          i++;
       }
     
     
       fclose (p_src);
       fclose (p_dest);
     
       remove ("calend.txt");
       rename (TMP_FILE, "calend.txt");
     
     
       return EXIT_SUCCESS;
    }
    Le fichier d'origine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin:vcalendar
    begin:vevent
    event1
    end:vevent
    end:vcalendar
    Le fichier modifié:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin:vcalendar
    begin:vevent
    event1
    end:vevent
    begin:vevent
    event2
    end:vevent
    end:vcalendar
    Il faut bien sûr que end:vcalendar soit la fin du fichier donc pas de ligne vide à la fin sinon ca fausse les résultat, c'est la seule contrainte
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai fais exactement ce que vous avez dit ca m'affiche n'importe quoi ca me répéte mes affichage 5 fois et ca met le begin et le end n'importe ou dans le fichier j'ai vraiment rien compris, en plus mon fichier s'enregistre sous le nom de memotemp au lieu de calend.txtdonc je suppose qu'il ne lit pas mon rename j'en sais rien voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    memoori=fopen("calend.txt","r");
     if (memoori==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
     
    memo= fopen("memotemp.txt","w");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
     while ((fgets (buffer1, BUF_SIZE, memoori)) != NULL)
       {
          /* On supprime le saut de ligne et on met un zero de fin. */
          {
             char * p = strchr (buffer1, '\n');
     
             if (p != NULL)
             {
                *p = 0;
             }
          }
    if (strcmp (buffer1, BEGIN) == 0)
          {
             fprintf (memo, "%s\n", buffer1);
          }
          else
          {
    fprintf (memo, "BEGIN:VEVENT\n");      
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fprintf(memo,"DTSTART:");
    fprintf(memo,"%s%s%sT%d%s00Z\n",annee,tab1,jour,nbred,minutesd);
    fprintf(memo,"DTEND:");
    fprintf(memo,"%s%s%sT%d%s00Z\n",annee,tab1,jour,nbref,minutesf);
    fprintf(memo,"RRULE:");
    fprintf(memo,"%s",tab3);
    fprintf(memo," ");
    fprintf(memo,"%s",tab4);
    fprintf(memo," ");
    fprintf(memo,"%s%s%s\n",anneef,tab2,jourf);
    fprintf (memo, "END:VEVENT\n");
          }
       } 
       fclose(memo);
       fclose(memoori);
       remove ("calend.txt");
       rename (TMP_FILE, "calend.txt");

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    je suis arrivé pour l'instant qu'avec la premiere ligne ce qui m'embete c'est quand on l'ouvre en w il détruit le fichier existant et du coup il enlev e ce qu'on a déjà enregistrer

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par pepsister
    je suis arrivé pour l'instant qu'avec la premiere ligne ce qui m'embete c'est quand on l'ouvre en w il détruit le fichier existant et du coup il enlev e ce qu'on a déjà enregistrer
    Hé, le fichier temporaire tu ne l'utilise que pour l'opération de réécriture/ajout, bien sûr, les noms des fichiers tu les adaptent, moi je vous montre qu'un exemple, il ne tiens qu'à vous de l'étudier, voir ce qu'il fait et l'expérimenter après si vous faites des modifications et que ca ne marche plus, vous devriez savoir assez rapidement ce qui cloche.

    Il faut pas simplement prendre le code et le mettre dans un code existant, cette astuce est vouée d'avance à l'échec

    Pour explication, le premier code que j'ai proposé ajoute un événement en début de fichier, juste après la balise d'ouverture et le second ajoute en fin, juste avant la balise de fermeture ! Et pour information, je peut ajouter autant d'événement que je veux au début du fichier, le fichier garde toujours la bonne structure générale. Il réside un petit bug dans le code qui insère à la fin mais ceci ne devrait pas poser de problème pour améliorer, du moins pour vous

    Après, oui le code peut être amélioré et adapté, j'ai fait ces codes en 2 ou 3 min donc ce n'est pas parfait mais c'est simplement un exemple !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  15. #15
    Membre averti
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    Il me reste un léger détail à régler... Je souhaite utiliser un autre type de fichier que le *.txt, c'est le .ics ou .vcs (au choix).

    J'ai remplacé tout bêtement mes .txt par .ics (ou vcs, j'ai tenté les deux) et à la lecture de la première ligne, il me fait un peu nimp... Il me met trois caractères chelous dans le buffer alors qu'après vérification, le B du BEGIN est bien le premier caractère du fichier. Si tu as une idée cher Franck ou quelqu'un d'autre, après tout...

  16. #16
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Franchement là je vois pas trop, changer l'extension, si s'en est une qui n'existe pas sur un programme installé, c'est simplement une extension, c'est comme changer le nom du fichier rien de plus
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  17. #17
    Membre averti
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    J'ai tenté de changer l'extension au début (rename(SOURCE,"calend.txt"), sachant que SOURCE est défini en calend.vcs et à la fin (rename(TMP_FILE,"calend.vcs)).
    Il convertit bien mais me donne des caractères bizarres dans le buffer avant la première ligne..

  18. #18
    Membre averti
    Inscrit en
    Février 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 68
    Par défaut
    J'ai encore changé pas mal de truc et ça marche maintenant. Le passage en .txt ne marchait pas, il faut rester en .vcs tout le temps

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    moi je suis désolé mais meme en restant en .txt je n'arrive toujours pas a afficher le bon truc ca ne me met rien du tout j'ai juste begin et end dans mon fichier comment dois je faire et qu'est ce qui est fait je comprend plus?
    voici mon programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    size_t nb_lines (const char *s_filename)
    {
           size_t size=0;
           FILE *p_file=fopen(s_filename,"r");
           if (p_file!=NULL)
           {
           char c;
           while ((c=fgetc(p_file))!= EOF)
           {
                 if (c== '\n')
                 {
                         size++;
                 }
           }
           fclose(p_file);
           }
    return size;
    }
    /*on écrit dans le fichier d'origine la forme que l'on veut*/
    /*on l'ouvre avec gestion des erreurs*/
    memoori=fopen("calend.txt","a");
     if (memoori==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
       /*on écrit la forme que l'on souhaite*/
       fprintf(memoori,"%s\n",BEGIN);
       fprintf(memoori,"VERSION:1.0 PRODID :PalmDesktop Generated\n");
       fprintf(memoori,"%s",END);
       fclose(memoori);
     
    /*ouverture du fichier d'origine en lecture pour récupérer les donner*/
    memoori=fopen("calend.txt","r");
     if (memoori==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
     
    memo= fopen(TMP_FILE,"w");
       if (memo==NULL) {
           perror("erreur d'ouverture du fichier");
           exit(0);
       }
     
     while((fgets(buffer1,BUF_SIZE,memoori))!=NULL)
     {
      if (i<lines-1) 
    {
             fprintf (memo, "%s", buffer1);
     
          }
          else
          {      
     fprintf (memo, "BEGIN:VEVENT\n");      
    fprintf(memo,"SUMMARY:");  
    fprintf(memo,"%s\n",entrer);
    fprintf(memo,"DESCRIPTION:");
    fprintf(memo,"%s\n",buffer);
    fprintf(memo,"DTSTART:");
    fprintf(memo,"%s%s%sT%d%s00Z\n",annee,tab1,jour,nbred,minutesd);
    fprintf(memo,"DTEND:");
    fprintf(memo,"%s%s%sT%d%s00Z\n",annee,tab1,jour,nbref,minutesf);
    fprintf(memo,"RRULE:");
    fprintf(memo,"%s",tab3);
    fprintf(memo," ");
    fprintf(memo,"%s",tab4);
    fprintf(memo," ");
    fprintf(memo,"%s%s%s\n",anneef,tab2,jourf);
    fprintf (memo, "END:VEVENT\n");
    fprintf(memo,"%s",END);
    break;
    }
    i++;
    }
       fclose(memo);
       fclose(memoori);
       remove ("calend.txt");
       rename (TMP_FILE, "calend.txt");
    voci mon code et quand je regarde ce qu'il y a dans le fichier après que l'utilisateur rentre toute les dates il m'affiche seulement begin:vcalendar, version... et end:vcalendar
    merci de m'aider la dessus

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 302
    Par défaut
    j'ai remplacé mes .txt en .vcs maintenant ca écrit toute mes donnees par contre ca ne me donne pas le Version:1.0 ProdidalmDesktop Generated
    comment faire?

Discussions similaires

  1. ouverture de fichier txt
    Par juguul dans le forum MFC
    Réponses: 11
    Dernier message: 18/12/2003, 09h44
  2. Ouverture de fichier en api
    Par Michaël dans le forum Windows
    Réponses: 9
    Dernier message: 10/12/2003, 16h47
  3. Ouverture de fichier
    Par Ricou.13 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/10/2003, 08h59
  4. Réponses: 2
    Dernier message: 26/02/2003, 15h18
  5. [VBA-E] Evenement ouverture de fichier
    Par gjeff dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/12/2002, 09h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo