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 :

Organiser les données d'un fichier


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par virtuadrack
    je sais qu'il faut mettre un if-else dans la for loop mais comment designer au programme la ligne 1, la ligne 3 et la ligne 5? Car je ne sais pas trop quoi inclure comme condition dans le if.

    J'ai du mal a traduire ce mecanisme en code. Je n'ai pas saisi le fait d'utiliser une variable binaire. Pourrais-tu etre plus precis.
    En fait c'est très simple. Voici le bon algorithme :
    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
     
    ouvrir le fichier original en lecture
    ouvrir le fichier gauche en écriture
    ouvrir le fichier droite en écriture
     
    initialiser une variable binaire à VRAI
    faire
     lire une ligne du fichier original
     si la variable binaire est VRAI
      elle vaut FAUX
      enregistrer la ligne dans le fichier gauche
     sinon
      elle vaut VRAI
      enregistrer la ligne dans le fichier droit
     fin si
    jusqu'à la fin du fichier original
     
    fermer les fichiers
    Je ne peux pas en dire plus sans dévoiler le code. Ce genre de raisonnement ne me parait pas extraordinaire... Tu trouves ça difficile ?

  2. #22
    Membre actif
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Points : 243
    Points
    243
    Par défaut
    Salut,

    Quelques remarques sur le code avant d'aller plus loin.

    Warnings du compilateur, à corriger :
    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
    Project   : test
    Compiler  : GNU GCC Compiler (called directly)
    Directory : G:\Documents\benoit\prog\test\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:16: warning: char format, different type arg (arg 2)
    main.c:43:2: warning: no newline at end of file
    main.c:13: warning: 'fp' might be used uninitialized in this function
    main.c:13: warning: 'inptr' might be used uninitialized in this function
    main.c:13: warning: 'inptr2' might be used uninitialized in this function
    Compiling: interpreteur.c
    Linking console executable: G:\Documents\benoit\prog\test\test.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 5 warnings
    
    Ensuite :fname est équivalent à &fname[0]
    Il faut donc supprimer le &
    Toutefois, je déconseille fortement d'utiliser scanf ici.
    Il faut construire une entrée sûre : http://emmanuel-delahaye.developpez.com/inputs.htm

    Puis, même si ton fichier n'est pas ouvert, tu tentes de le fermer.
    Plantage assuré (as-tu essayé ?).

    Ensuite, tu ne testes pas l'ouverture des fichiers.
    Il faut impérativement le faire.

    Essaie de tenir compte de ces remarques, fais de ton mieux pour construire un programme solide, puis on t'aidera pour la suite du problème

    EDIT : je vois qu'Emmanuel te propose un algo, essaie donc de le coder en C en tenant compte de mes remarques sur ton premier code.

  3. #23
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Avant de continuer, mon compilateur compile le code que j'ai donne precedemment sans afficher aucun warning

    J'utilise SSH sous UNIX:
    > gcc code.c -o code
    > code

    ya t-il une commande specifique pour afficher ses warning ? parce que je ne les vois pas...

  4. #24
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    gcc -Wall -pedantic ....

  5. #25
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    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
     
    #define TRUE 1
    #define FALSE 0
    ...
     
    if (strcmp ( fname, FILENAME )) {
            printf("Unable to open file specified!\n");
    }
     
    else
    {
             fp = fopen ( FILENAME, "r" );
             inptr = fopen ( "east.dat", "w");
             inptr2 = fopen ( "west.dat", "w");
     
             x = 1;
     
             do {
                    while ( fgets( buffer, sizeof buffer, fp ) != NULL )
                    {
                            fputs( buffer, stdout );
     
                            if (x=1){
                                    x = 0;
                                    fprintf(inptr, "%s", buffer);}
     
                            else{
                                    x=1;
                                    fprintf(inptr2, "%s", buffer);}
     
                     }
                   } // endif ?                
               }
    Emmanuel, sois pas avare en code Je fais de mon mieux (j'ai débuté en C ya meme pas 2 mois, c'est pour ca que j'ai des difficultés...)

    Dans l'algo que tu as mis, un fin-si est traduit par endif ? Quelles est la bonne syntaxe ?

    Jusqu'à la fin du fichier, est je dois utiliser feof ?

    Merci dodders pour ta contribution, j'ai enleve le &, mais j'ai tjrs une segmentation fault quand l'input n'est pas bon, malgre que l'erreure que j'ai inclus est affichee...mais je laisserais ce tracas pour plutard.

  6. #26
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par virtuadrack
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TRUE 1
    #define FALSE 0
    OK, mais en C, 0 et 1 se suffisent à eux même ils ont déjà le sens 'FAUX/VRAI'...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (strcmp ( fname, FILENAME )) {
            printf("Unable to open file specified!\n");
    }
     
    else
    {
    Je ne sais pas à quoi sert ce bazar...

    Voir mes commentaires dans ce 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
     
             fp = fopen ( FILENAME, "r" );
             inptr = fopen ( "east.dat", "w");
             inptr2 = fopen ( "west.dat", "w");
     
             x = 1; /* -ed- OK. Mais x a bien été defini ? */
     
             do { /* -ed- inutile. Il y a déjà le while (fgets() ...) */
                    while ( fgets( buffer, sizeof buffer, fp ) != NULL )
                    {
                            fputs( buffer, stdout ); /* -ed- debug, OK */
     
                            if (x=1){ /* -ed- = est l'opérateur d'affectation. 
                                            Jamais entendu parlé de == pour 
                                            faire des comparaisons ? */
                                    x = 0;
                                    fprintf(inptr, "%s", buffer);}
     
                            else{
                                    x=1;
                                    fprintf(inptr2, "%s", buffer);} 
    /* -ed- le endif est ici..., mais c'est tellement mal 
    indenté qu'on ne le voit pas... */
     
                     }
                   } // endif ?  /* -ed- ben non... */              
               }/* -ed- a supprimer */
    C'est horriblement mal présenté. L'indentation est une chose sérieuse et simple. Voici une version lisible de ton 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
     
       fp = fopen (FILENAME, "r");
       inptr = fopen ("east.dat", "w");
       inptr2 = fopen ("west.dat", "w");
     
       x = 1;
     
       while (fgets (buffer, sizeof buffer, fp) != NULL)
       {
          fputs (buffer, stdout);
     
          if (x == 1)
          {                         
             x = 0;
             fprintf (inptr, "%s", buffer);
          }
          else
          {
             x = 1;
             fprintf (inptr2, "%s", buffer);
          }
       }
    Dans l'algo que tu as mis, un fin-si est traduit par endif ? Quelles est la bonne syntaxe ?
    Voir la version corrigée au-dessus.
    Jusqu'à la fin du fichier, est je dois utiliser feof ?
    Non. La boucle avec fgets() fait le boulot. Un algo montre le fonctionnement général. Les détails d'implémentation appartiennent à chaque langage.

  7. #27
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    J'ai ajoute fgets mais quand j'execute le 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
    52
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    # define   FILENAME   "input.dat"
     
    int main ( void )
    {
    char fname [21];
    char buffer [81];
    int x;
     
    FILE * fp, * inptr, * inptr2;
     
    printf("Enter file name: ");
    scanf("%s", fname);
     
    if (strcmp ( fname, FILENAME ))
    {
       printf("Unable to open file specified!\n");}
     
       else
       {
          fp = fopen ( FILENAME, "r" );
          inptr = fopen ( "east.dat", "w");
          inptr2 = fopen ( "west.dat", "w");
          x = 1;
     
         while ( fgets( buffer, sizeof buffer, fp ) != NULL )
         {
               fputs( buffer, stdout );
     
               if (x=1)
              {
                 x = 0;
                 fprintf(inptr, "%s", buffer);
               }
     
               else
               {
                   x=1;
                   fprintf(inptr2, "%s", buffer);}
               }
     
                    fgets(buffer, 81, fp);
          }
     
       fclose(fp);
       fclose(inptr);
       fclose(inptr2);
       return 0;
    }
    Le fichier east.dat contient toutes les infos du fichier originale, quant a west.dat il est vide. Est ce qu'il y a un probleme dans la logique ?

    Sinon autre question, comment additionner les chiffres contenus dans chaque ligne et mettre la resultat a la fin de chaque ligne du fichier east.dat et west.dat

  8. #28
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par virtuadrack
    J'ai ajoute fgets
    Pourquoi ? Qu'es-ce que j'ai dit qui pourrait te faire croire ça ?
    A part ça, as-tu lu mes commentaires ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                            if (x=1){ /* -ed- = est l'opérateur d'affectation. 
                                            Jamais entendu parlé de == pour 
                                            faire des comparaisons ? */
    parce que visiblement, c'est sans effet. Tu continues à utiliser le mauvais opérateur pour tester l'égalité... Je perds mon temps ou quoi ?
    Sinon autre question, comment additionner les chiffres contenus dans chaque ligne et mettre la resultat a la fin de chaque ligne du fichier east.dat et west.dat
    Pour ça, il faut convertir la ligne lue en valeurs numériques (strtol(), strtod(), selon le type, ou sscanf() si le format est fixe), faire le calcul qui va bien.

    Ensuite, il faut construire une chaine de taille suffisante pour contenir les données à écrire dans le fichier.

    On place le données dans cette chaine (sprintf()) et on écrit la chaine dans le fichier adéquate, selon l'aiguillage...

    Mais commence par régler tes problèmes d'aiguillages. Une chose à la fois.

  9. #29
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    # define   FILENAME   "input.dat"
     
    int main ( void )
    {
    char fname [21];
    char buffer [81];
    int i, count=1;
    int count2=1;
    int x;
     
    FILE * fp, * inptr, * inptr2;
     
    printf("Enter file name: ");
    scanf("%s", fname);
     
    if (strcmp ( fname, FILENAME ))
    {
       printf("Unable to open file specified!\n");}
     
       else
       {
          fp = fopen ( FILENAME, "r" );
          inptr = fopen ( "east.dat", "w");
          inptr2 = fopen ( "west.dat", "w");
          x = 1;
     
         while ( fgets( buffer, sizeof buffer, fp ) != NULL )
         {
               fputs( buffer, stdout );
     
               for ( i = 0; i < sizeof buffer; i++)
               {
                    buffer[i] = toupper(buffer[i]);
               }
     
               if (x==1)
              {
                 x = 0;
                 fprintf(inptr, "Roster#%i - %s", count++, buffer);
               }
     
               else
               {
                   x=1;
                   fprintf(inptr2, "Roster#%i - %s", count2++, buffer);}
               }
     
                    fgets(buffer, 81, fp);
          }
     
       fclose(fp);
       fclose(inptr);
       fclose(inptr2);
       return 0;
    }

  10. #30
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par virtuadrack
    <du code sans questions...>
    Mes commentaires. Pose des questions si tu ne les comprend pas
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    # define   FILENAME   "input.dat"
     
    int main ( void )
    {
    char fname [21];
    char buffer [81];
    int i, count=1;
    int count2=1;
    int x;
     
    FILE * fp, * inptr, * inptr2;
     
    printf("Enter file name: ");
    scanf("%s", fname);
     
    if (strcmp ( fname, FILENAME ))
    {
       printf("Unable to open file specified!\n");}
    /* -ed- Mauvais anglais. A quoi sert ce code ? 
               Soit le nom est connu et tu ne dois pas le saisir, 
               soit c'est l'utilisateur qui choisit et c'est le test 
               d'ouverture du fichier qui déterminera si le fichier 
               est connu ou non. */
     
       else
       {
          fp = fopen ( FILENAME, "r" );
          inptr = fopen ( "east.dat", "w");
          inptr2 = fopen ( "west.dat", "w");
     
    /* -ed- Dans la réalité, ne pas oublier de tester la valeur retournée par fopen() avant de l'utiliser */
          x = 1;
     
         while ( fgets( buffer, sizeof buffer, fp ) != NULL )
         {
               fputs( buffer, stdout ); /* -ed- debug, OK */
     
               /* -ed- mise en majuscule de la ligne lue, OK
                          sizeof buffer n'est pas faux, mais il suffit 
                          de s'arréter au premier 0 rencontré 
                          (fin de chaine).
                */
               for ( i = 0; i < sizeof buffer; i++)
               {
                    buffer[i] = toupper(buffer[i]);
               }
     
               /* -ed- Ah, enfin. OK. */
               if (x==1)
              {
                 x = 0;
                 /* -ed- écriture directe dans le fichier , oui, bien sûr. OK. */
                 fprintf(inptr, "Roster#%i - %s", count++, buffer);
               }
               else
               {
                   x=1;
                   fprintf(inptr2, "Roster#%i - %s", count2++, buffer);} /* -ed- C'est quoi ce } ?*/
               }
     
                    /* -ed- j'ai toujours pas compris le rôle de cette ligne. 
                               A supprimer. */
                    fgets(buffer, 81, fp);
          }
     
       fclose(fp);
       fclose(inptr);
       fclose(inptr2);
       return 0;
    }

Discussions similaires

  1. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  2. Sauvegarder les données dans un fichier CSV
    Par beb30 dans le forum MFC
    Réponses: 5
    Dernier message: 08/03/2006, 13h06
  3. [VB 6.3] Traiter les données d'un fichier
    Par yaya54 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 21/02/2006, 14h00
  4. [](VB) Récupérer les données dans un fichier .xml
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 02/10/2005, 20h39
  5. [JTable] Comment récuperer les données d'un fichier texte ?
    Par Makunouchi dans le forum Composants
    Réponses: 2
    Dernier message: 03/05/2005, 16h37

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