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 :

traitement des fichiers en c++


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 1
    Points : 1
    Points
    1
    Par défaut traitement des fichiers en c++
    Bonjour tout le monde.

    Je suis débutante en c++ et j’ai besoin de votre aide dans une partie du mon programme ( qui est inspirer de l’un des programmes qui existe dans le forum). en fait, le principe est de prendre un fichier contenant des caractères / symboles / chiffre (par exemple : le source latex d'un article, avec des symboles et des chiffres). On génère un nombre aléatoire N qui servira à spécifier combien de symboles on lit du fichier (longueur de q) , on exécute ensuite p1,p2, p3 et p4 et on compare les résultats avec l'oracle qui est basé sur P4. On refait cela tant que not eof c'est-à-dire, on prend les N prochains caractères du fichier. Tout ce procédé, on le refait 100 fois, donc 100 fois on génère un nombre aléatoire et on fait le travail sur tout le fichier. Et à la fin les c1,c2,c3,c4 nous donneront combien de fois chaque programme était correct par rapport à P4.
    Le programme P1 : traite les lettres majuscules.
    Le programme P2 : traite les lettres majuscules ou minuscules.
    Le programme P3 : traite les lettres majuscules, minuscules et le chiffre de 0 a 9.
    Le programme P2 traite tous les lettres, les chiffres et les symboles.

    La partie qui manque dans mon code consiste a importer un fichier et tant que ce n’est pas la fin du ficher (not eof), on prend une chaîne q de longueur N (valeur tirée aléatoirement on appelant le randomgenration) on exécute P1, P2, P3, P4 sur la base de ce q, par la suite on prend la prochaine chaîne q de longueur N et on exécute les 4 programmes et on refaire cela jusqu’à on arrive à la fin du fichier. Si le fichier est fini on le réinitialise et le reparti du nouveau. En cas ou la chaîne qui reste dans le fichier est inférieur à N (valeur aléatoire) on l’ignore. On refaire tout ce procédure 100 fois donc 100 fois on génère un nombre aléatoire et on fait le travail sur tout le fichier. voila 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
    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    #include <iostream>
    #include <iomanip>
    #include <array>
    #include <vector>
    #include <random>
    #include <thread>
    #include <cstdlib>
    #include<ctime>
    #include <cstring>
    #include <fstream>
    using namespace std;
     
    struct state {
     
                int let, dig, other;
                char q[];
    };
     
    state sinitial;
    state sfinal;
     
     
    bool oracle (state sinitial,  state sfinal)
    {
     
    sfinal= P4();
     
     
     
    return((sinitial.q==sfinal.q)& (sinitial.let=sfinal.let) & (sinitial.dig=sfinal.dig) & (sinitial.other=sfinal.other));
    }
     
     
    //-----------------------------------------------------------------------------
     
     
    state p1()
    {state s;
        int i=0;
        int let=0;
        int dig=0;
        int other=0;
        char q[10];
        int l=strlen(q);
        while(i<l){
            char c=q[i];
            i++;
            if(c>='A' && c<='Z')
            {
                let++;
            }
        }
        s.let=let;
        s.dig=0;
        s.other=0;
        s.q=0;
        return(s);
    }
     
    state p2()
    {state s;
        int i=0;
        int let=0;
        int dig=0;
        int other=0;
        char q[100];
        int l=strlen(q);
        while(i<l){
            char c=q[i];
            i++;
            if((c>='A' && c<='Z') ||(c>='a' && c<='z'))
            {
                let++;
            }
        }
        s.let=let;
        s.dig=0;
        s.other=0;
        s.q=0;
        return(s);
    }
     
    state p3()
    {state s;
        int i=0;
        int let=0;
        int dig=0;
       int other=0;
       char q[100];
        int l=strlen(q);
        while(i<l){
            char c=q[i];
            i++;
            if((c>='A' && c<='Z') ||(c>='a' && c<='z'))
            {
                let++;
            }
            else if(c>='0' && c<='9')
            {
                dig++;
            }
        }
        s.let=let;
        s.dig=dig;
        s.other=0;
        s.q=0;
        return(s);
    }
     
    state p4()
    {state s;
       int i=0;
        int let=0;
        int dig=0;
        int other=0;
        char q[100];
        int l=strlen(q);
        while(i<l){
            char c=q[i];
            i++;
            if((c>='A' && c<='Z') ||(c>='a' && c<='z'))
            {
                let++;
            }
            else if(c>='0' && c<='9')
            {
                dig++;
            }
            else
            {
                other++;
            }
        }
        s.let=let;
        s.dig=dig;
        s.other=other;
        s.q=0;
        return(s);
    }
     
     
    //-------------------------------------------------------------------
    int randomgeneration(int n)
    {
        int partSize   = 1 + (n == RAND_MAX ? 0 : (RAND_MAX - n) / (n + 1));
        int maxUsefull = partSize * n + (partSize - 1);
        int draw;
     
        do {
            draw = rand();
        } while (draw > maxUsefull);
     
        return draw / partSize;
    }
    //--------------------------------------------------------------------------
    void tesdriver(int testdatasize)
    {int counters1=0;
     int counters2=0;
     int counters3=0;
     int counters4=0;
     
     
    for(int testindex=1; testindex <= testdatasize; ++testindex) {
    state sinitial, sfinal;
    sinitial.n= randomgeneration(10);
     
    /*std::ofstream fichier;
    std::fstream fichier;
    fichier.open ("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);
    fichier.open("fich.txt", );
    char c; c=fichier.get();*/
     
    std::string filename = "fich";
     
    std::fstream fichier;
     
    fichier.open(filename);
     
    while(!fichier.eof())
    {
     
     
     
     
     
     
     
     
     sinitial.let=0;
     sinitial.dig=0;
     sinitial.other=0;
     sfinal.let=0;
     sfinal.dig=0;
     sfinal.other=0;
    if(oracle (sinitial,p1())) ++counters1;
     
     
    sinitial.let=0;
     sinitial.dig=0;
     sinitial.other=0;
     sfinal.let=0;
     sfinal.dig=0;
     sfinal.other=0;
     
    if(oracle (sinitial,p2())) ++counters2;
     
    sinitial.let=0;
     sinitial.dig=0;
     sinitial.other=0;
     sfinal.let=0;
     sfinal.dig=0;
     sfinal.other=0;
    if(oracle (sinitial,p3())) ++counters3;
     
    sinitial.let=0;
     sinitial.dig=0;
     sinitial.other=0;
     sfinal.let=0;
     sfinal.dig=0;
     sfinal.other=0;
     
    if(oracle (sinitial,p4())) ++counters2;
     
    }
     
      std::cout << "reliability of p1 : " << (counters1 / static_cast<double>(testdatasize)) << std::endl;
      std::cout << "reliability of p2 : " << (counters2/ static_cast<double>(testdatasize)) << std::endl;
      std::cout << "reliability of p3 : " << (counters3 / static_cast<double>(testdatasize)) << std::endl;
    }
    }
    int main()
    {
        tesdriver(100);
    }

  2. #2
    Membre habitué
    Homme Profil pro
    automatisme
    Inscrit en
    Octobre 2012
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 54
    Points : 152
    Points
    152
    Par défaut
    Bonjour,
    si ce que tu cherches à faire correspond au blanc ligne 180, il faut que tu utilises la méthode 'read' (hérité de istream):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read (char* s, streamsize n);
    Elle est simple à prendre en main et va bien avec les paramètres que tu as (s=q et n=N).
    La méthode 'gcount()' retourne le nombre de caractères lus lors du dernier appel de read() (ou get(), getline(), ignore()) pour savoir si tu es à la fin de fichier.
    Avec ça, tu devrais réussir à faire ce que tu souhaites

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Autant te le dire, je n'ai lu le code qu'en diagonale, mais j'ai quelques remarques à faire sur ce que j'ai lu.

    La directive using namespace std; est une directive qui a été créée au tout début de la normalisation du C++, lorsque les espaces de noms sont apparus et que les normalisateurs ont décider de placer le contenu de la bibliothèque standard dans l'espace de noms std.

    Comme il y avait déjà une grosse quantité de code qui utilisait la bibliothèque standard, il fallait veiller à ce que ce code puisse continuer à travailler sans nécessiter "trop de modifications". La directive using namespace std est apparue comme étant "la moins mauvaise solution" permettant d'évtiter d'avoir trop de modification à apporter.

    Mais depuis, nous avons pu nous rendre compte que cette solution est surtout un pis-aller qui occasionne bien plus de problèmes qu'elle n'en résout. Et puis, le problème dont je te parle ne devrait en théorie toucher que du code qui a été écrit... il y a près de vingt ans!

    A l'heure actuelle, tout le monde devrait s'habituer au fait que la bibliothèque standard se trouve ... dans l'espace de noms std. Si bien que l'on préférera utiliser les noms "pleinement qualifiés" comme std::cin, std::cout, std::ifstream etc.

    A la ligne 16 (char q[];) tu utilises ce que l'on appelle un VLA (Variable Length Array). Cette pratique n'a jamais été acceptée en C++. Elle est apparue un temps en C, mais il me semble qu'elle a été supprimée car ils se sont rendus compte qu'elle posait plus de problèmes qu'elle n'en résolvait

    Si ce que tu veux, c'est représenter "un tableau de caractères" (sans autre spécification), tournes toi vers la classe std::array, si tu connais le nombre d'éléments qu'il doit contenir à la compilation ou vers la classe std::vector dans le cas contraire.

    Si ce que tu veux, c'est représenter une chaine de caractères, tournes toi vers la classe std::string.

    Dans tous les cas, tu verras que tu ne t'en porteras que mieux

    Les variables globales, comme on en trouve à la ligne 19 (state sinitial;) ou à la ligne 20 (state sfinal;) C'EST MAL!!!. Transmet ces données comme paramètres, récupère les comme valeur de retour de fonction, cela te simplifiera grandement la vie

    De manière générale, essaye de "formater" ton texte pour le rendre plus facile à lire:
    • indente le correctement : chaque fois que tu ouvre une accolade (ou une parenthèse), décale toi d'un nombre toujours identique d'espaces vers la droite, redécale toi vers la gauche lorsque tu croise une accolade (ou une parenthèse) fermante
    • évite les lignes "trop longues": 80 colonnes de large, c'est couramment accepté
    • quand tu as des tests complexes (ex (sinitial.q==sfinal.q) & (sinitial.let=sfinal.let) & (sinitial.dig=sfinal.dig) & (sinitial.other=sfinal.other)), va à la ligne (avec l'indentation qui va bien) pour chacun des tests qui est fait)
    • Si un code n'a pas de raison d'être, supprime le au lieu de le commenter: les commentaires qui "désactivent" du code inutile produisent du "bruit" qui rend la lecture plus compliquée.



    En écrivant ces lignes, je me rend compte que tu as utilisé une fois == et trois fois =... Fais gaffe, ce sont deux opérateurs différents, qui font des choses différentes

    Essaye de choisir des noms (pour tes variables, pour tes paramètres et pour tes fonctions) qui correspondent à l'utilisation qui en est faite.

    Par exemple, le nom du paramètre de ta fonction tesdriver (testdatasize) aura tendance à induire le lecteur du code en erreur quant à l'utilité de ce paramètre:

    En effet, le nom que tu as choisi pourrait laisser croire au lecteur du code que ce paramètre induit la taille des données qui doivent être traitées (testées, pour être précis), alors que ce paramètre représente... le nombre de fois où toute la logique doit être effectuée. Il serait sans doute plus intéressant de le nommer executionCount ou quelque chose du genre, car cela correspond d'avantage à son utilisation

    Au sujet de l'utilisation de rand:

    Tu n'initialise jamais la graine de génération aléatoire avec srand. Il faut pourtant le faire une fois (minimum), mais une seule et unique fois
    l'utilisation de rand (et de srand) est dépréciée depuis l'arrivée de C++11 et du fichier d'en-tête <random>. Tu devrais t'habituer à utiliser ces fonctionnalités, elles te simplifieront la vie

    Au sujet de l'utilisation des fichiers

    De manière générale, la lecture d'information depuis un fichier compte parmi les processus les plus lents que l'on puisse trouver. Il n'y a guère que l'accès à des données au travers du réseau qui soit encore plus lent.

    Or, tu veux lire ton fichier... 100 fois coup sur coup. On peut pas vraiment dire que ce soit le plus efficace que l'on puisse faire

    Tu pourrais, par exemple, envisager de charger l'intégralité du fichier une bonne fois pour toute dans un buffer (en t'inspirant, par exemple, de ==>cette entrée de la faq<==), et parcourir le-dit buffer 100 fois au lieu de lire le fichier à chaque fois.

    Il semble en effet logique de penser que le contenu de ton fichier ne changera pas entre deux périodes de tests

    Il y aurait sans doute encore beaucoup à dire concernant ton code, mais je vais déjà te laisser "assimiler" les remarques que voici
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traitement des fichiers textes
    Par Julien Dufour dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/08/2008, 15h50
  2. Traitement des fichiers
    Par ouadie99 dans le forum C#
    Réponses: 5
    Dernier message: 17/04/2008, 15h49
  3. traitement des fichiers
    Par stanley1415 dans le forum Informix
    Réponses: 2
    Dernier message: 30/01/2008, 22h07
  4. DEV-C++ et le traitement des fichiers EXCEL
    Par titos09 dans le forum Dev-C++
    Réponses: 0
    Dernier message: 22/10/2007, 17h11
  5. Réponses: 1
    Dernier message: 24/07/2005, 22h25

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