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 :

comparaison de 2 chiffres dans un fichier avec c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Par défaut comparaison de 2 chiffres dans un fichier avec c
    salut
    j'ai un fichier "sortieF.txt" qui contient 35940 lignes et dans chaque ligne 2 chiffre séparé par un virgule je veux faire la différence entre ces 2 chiffres .
    j'ai un code son pb qu'il peut lire seulement 6300 lignes.
    aidez moi.
    voici 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
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define CMAX 17 //nb colonne
    #define LMAX 6300 //nb ligne
    #define MAX_CHAR_PER_LINE 1650 //nb caractere par ligne (pas de probleme)
    #define SEP "," //separateur entre les chifre
    #define FICH "sortieF.txt" //fichier ou se trouve mes donnes
     
     
    int main(int argc, char* argv[])
    {
         FILE *m_File, *p;
         int i = 0;
         int j;
         float Tab[LMAX][CMAX];
         char szbuff[MAX_CHAR_PER_LINE];
         char* token;
     
         // On initialise le tableau a -1
         for(i=0;i<LMAX;i++)
        {
             for(j=0;j<CMAX;j++)
            {
                 Tab[i][j] = -1;
            }
        }
     
        // On réinitialise le compteur de ligne car i;a été incrémenté lors de l'iniatialisation
        i = 0;
     
        // On ouvre le fichier en lecture seule et en mode texte
        m_File = fopen(FICH,"rt");
     
        //un autre fichier pour stoker le resulat
        p=fopen("stockTab.txt","w");
     
        if(!m_File) 
            return 1;
     
        // On lit le fichier ligne a ligne et on stocke les valeurs dans un tableau  d'entier
        while(!feof(m_File) && i < LMAX)
        {
             j = 0;
     
             // On récupere la ligne courante du fichier
             fgets(szbuff,MAX_CHAR_PER_LINE,m_File);
     
             // On decoupe la ligne selon le charactere de séparation SEP (" ")
             // strtok() -> decoupage de chaine de caracteres
            token = strtok(szbuff,SEP);
     
             // On lit les éléments découpés un à un et on les stocke dans le tableau  Tab
             while(token != NULL && j < CMAX)
            {
                  // On stocke la valeur lue dans le tableau
                 Tab[i][j] = atof(token);
                 // On lit l'element suivant retourner par strtok
                 token = strtok(NULL,SEP);
                 // On incremente le compteur des ordonnées
                 j++;
             }
     
           // On incrémente le compteur des abscisses
           i++;
        }
     
         // On stoke le tableau dans un fichier
         float n=0;
         for(int x=0;x<i;x++)
         {
              for(int y=0;y<j;y++)
             {
                  n=Tab[x][0]-Tab[x][1];
                  fprintf(p,"%0.6f\t",Tab[x][y]);
             }
     
             fprintf(p,"la difference est : %0.6f ",n);
             fprintf(p ,"\n");
         }
     
         fclose(p);
         return 0;
     
    }

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    Bonjour,
    plusieurs petites choses :
    1. Pensez à utiliser les balises code (le dièze)
    2. Pensez à indenter votre code -> lisibilité
    3. Pensez à tester chaque retour (fopen, popen, ....)
    Voila
    bon courage

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ballo
    voici le code:
    • Les commentaires // ne sont pas compatibles avec C90.
    • La forme "for (int x = 0; ..." n'est pas compatible avec C90.
    • Ne pas dépasser 80 colonnes.
    • fopen() : "rt" n'existe pas. C'est "r".
    • fopen() : l'ouverture en écriture peut aussi échouer. Elle n'est pas testée...
    • "if (!m_File)" pour tester un pointeur est très laid. Préférer if (m_File == NULL). Les relecteurs de code ne sont pas forcément de C-geeks...
    • feof() est mal employé et ne fait pas ce que tu crois (probablement inutile ici). Pour tester la fin de lecture, il faut exclusivement tester la valeur retournée par la fonction de lecture.

    Sinon, pour ton problème, je crois que tu confonds chiffre et nombre (un chiffre est par définition un entier, pourquoi float ?)

    D'autre part, pourquoi ne pas traiter les lignes unes à unes ? Est-ce bien nécessaire de stocker l'ensemble du tableau en mémoire ? Tu ne fais de traitements par colonne, que je sache ?

    De plus, tu n'utilises que les deux premiers éléments. Pourquoi stocker toute la ligne de valeurs ?

    Bref, tu fais beaucoup plus de travail que nécessaire.

    Revois ton algo et simplifie le. Il est trivial de

    - Lire le fichier ligne à ligne (inutile de lire la ligne complète, les 100, voire 50 premiers caractères suffisent, à vérifier avec le format des données. Penser à purger les autres...)
    - Extraire les deux premières valeurs (sscanf() suffit, pas besoin de sortir strtok()... ou alors une boucle avec strtod(), légèrement plus subtile...
    - faire la différence entre les valeurs
    - écrire le résultat dans l'autre fichier.

    Il n'y a absolument pas besoin de cet énorme tableau...

Discussions similaires

  1. Réponses: 20
    Dernier message: 25/09/2005, 15h07
  2. Ecriture dans un fichier avec la fonction AWK
    Par tux2005 dans le forum Linux
    Réponses: 2
    Dernier message: 21/07/2005, 10h58
  3. Rechercher dans un fichier avec emacs
    Par ggnore dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/11/2004, 10h28
  4. enregistrer dans un fichier avec une appli mdi
    Par ferrari dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/05/2002, 15h17

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