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 :

lecture de fichier


Sujet :

C

  1. #21
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Tusbar Voir le message
    Ca j'ai bien vu, pourtant il n'y a rien de difficile dedans, c'est tout simplement parce que tu cherches a utiliser des fonctions deja toutes faites - dont tu ne comprends pas forcement le fonctionnement.

    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
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    /* Taille qui va etre lue dans le fichier */
    #define BUFF_SIZE	512
     
    int	func(char *path, int *nb, int *first)
     {
       int	fd; /* Filme descriptor sur ton fichier a ouvrir */
       char	buffer[BUFF_SIZE]; /* buffer pour lire ton fichier */
       int	retread; /* controle le retour de read : -1 = erreur, 0 = plus rien a lire */
       int	i; /* index qui va parcourir le buffer lu a chaque fois pour compter le nombre de chiffres */
       char	flag; /* flag qui permet de savoir si on est au premier caractere de la premiere lecture pour le recuperer */
     
       flag = 0; /* intitialisation de flag a 0, on est au debut */
       if ((fd = open(path, O_RDONLY) == -1) /* on ouvre le fichier en lecture seule */
          return (printf("Error on opening\n")); /* erreur si open retourne -1, tu peux utiliser errno (perror) */
        while ((retread = read(fd, buffer, BUFF_SIZE) > 0) /* tant qu'on lit quelque chose */
         {
           if (flag == 0) /* si le flag est a 0, on recupere le premier chiffre ... */
             {
               *first = buffer[0]; /* on le stocke dans first */
                 flag = 1; /* on met le flag a 1, on est plus au debut */
             }
           for (i = 0; i < BUFF_SIZE; i++) /* on parcourt le buffer pour compter les chifres */
             {
               if (buffer[i] >= '1' && buffer[i] <= '9')  /* correspond a un "isnum" ou "isdigit, on regarde si le caractere est entre 1 et 9 (entre quotes car ce n'est pas le caractere qui a pour valeur ascii 1 ou 9, mais les ' ' permettent de recuperer la valeur ascii du chiffre 1 ou 9 */
                 ++(*nb);  /* on incremente la variable qui compte le nombre de chiffres */
             }
         }
        if (close(fd) = -1) /* on ferme le fichier */
          return (printf("Error on closing\n")); /* on error... */
       return (0);
     }
     
    int	main(void)
     {
       char	*my_file;  /* ton fichier */
       int	nb;           /* nombre de chiffres */
       int	first;         /* premier chiffre */
     
       my_file = "test.txt";
       if (func(my_file, &nb, &first) != 0)
         return (1);
       printf("nb = %i, first = %d\n", nb, first);
       return (0);
    Voila ?
    C'est une usine à gaz que tu programmes ? open, read et cie ce n'est pas standard. tu te compliques la vie à buffer[i] >'1' ou <'9' alors que isdigit le fait

    regarde mon code
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Et tu penses que fopen fait quoi ? a part retourner un pointeur sur file ?

  3. #23
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Tusbar Voir le message
    Et tu penses que fopen fait quoi ? a part retourner un pointeur sur file ?
    Beh ca me suffit amplement je n'ai rien besoin d'autre
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    La n'est pas vraiment le probleme, c'est surtout par rapport a fgetc. Tu lis ton fichier caractere par caractere, c'est bien sur un fichier de... 100 octets ?



    /*
    open, read, write, close ? pas standard, lol ?
    */

  5. #25
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Tusbar Voir le message
    La n'est pas vraiment le probleme, c'est surtout par rapport a fgetc. Tu lis ton fichier caractere par caractere, c'est bien sur un fichier de... 100 octets ?



    /*
    open, read, write, close ? pas standard, lol ?
    */
    Oui et alors c'est toi qui pose une contrainte de 500MO non ? Et je ne vois pas où est le problème si je mets un supercalculateur nippon tri-processeur


    Les fonctions de base c'est fopen, fread,fwrite et fclose.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  6. #26
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 31
    Points
    31
    Par défaut
    merci pour votre aide, je vais regarder ca, par contre, Hegros, es-tu sur que ton code fonctionne, parce j'ai essayé et, quand je n'ai que 3 chiffres, il me répond qu'il en a 14890...etc (à mon avis c'est une adresse).

  7. #27
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    avec 123 cela fonctionne

    tu as un exemple ? j'edite le ficher avec cb
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  8. #28
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Points : 47
    Points
    47
    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
    #include<stdio.h>
    #include<ctype.h>
     
     
    int main(void) {
     
     
        FILE * fichier = fopen("nombres.txt", "r");
     
        if(fichier!=NULL) {
     
            int nombre_chiffre = 0;
            int premier_chiffre ;
     
            while((carac= fgetc(fichier))!= EOF) {
                if(isdigit(carac)) {
                    nombre_chiffre++;
                    if(nombre_chiffre==1)
                        premier_chiffre =carac -'0';
                }
     
                /*carac=fgetc(fichier);*/
            }
     
            /* fermeture du fichier */
            fclose(fichier);
     
            printf("Premier chiffre %d Nombre de chiffre %d", premier_chiffre, nombre_chiffre);
     
        } else {
            perror("echec ouverture fichier");
        }
     
     
        return 0 ;
    }
    tu essai avec ce code (de hegros) avec toute petite modification dans le while et le carac.

  9. #29
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 31
    Points
    31
    Par défaut
    ca fonctionne. La fonction isdigit sert juste à vérifier qu'on lit bien un chiffre ? que ce passe-t-il si on recontre un espace ?
    Dernière question: " carac -'0' " ca signifie quoi ?

  10. #30
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    dans ton manuel
    isdigit()
    vérifie si l'on a un chiffre (0 a 9)
    ensuite c'est parce que fgetc renvoi un int qui corresponds au code ASCII du caractère lu. Tu remarqueras que le code ASCII de '0' est 48 donc en le soustrayant de ce que je lis j'obtiens en principe le chiffre que tu recherches

    Avec un while et un int à la place d'un char

    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
     
     
    #include<stdio.h>
    #include<ctype.h>
     
     
    int main(void) {
     
     
        FILE * fichier = fopen("nombres.txt", "r");
     
        if(fichier!=NULL) {
     
            int nombre_chiffre = 0;
            int premier_chiffre ;
     
            int carac;
            while((carac=fgetc(fichier))!= EOF) {
                if(isdigit(carac)) {
                    nombre_chiffre++;
                    if(nombre_chiffre==1)
                        premier_chiffre =carac -'0';
                }
            }
     
            fclose(fichier);
     
            printf("Premier chiffre %d Nombre de chiffre %d", premier_chiffre, nombre_chiffre);
     
        } else {
            perror("echec ouverture fichier");
        }
     
     
        return 0 ;
    }
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  11. #31
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Points : 31
    Points
    31
    Par défaut
    Un grand merci pour votre aide !

  12. #32
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut
    J'ai sans doute beaucoup de mauvaises habitudes mais voici comment je traiterais le problème :
    1/ lecture de tout le fichier dans un tampon (rapidité)
    2/ puis boucle avec un UCHAR* lisant les valeurs
    3/ test si c'est autre chose que compris entre '0' et '9'
    - si non incrémentation du compteur de chiffres et autres traitements
    - si oui incrémentation du compteur de lignes et sous boucle tant que la conditions >'0' && <='9' est fausse

  13. #33
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Sur de gros fichiers c'est clair qu'on utilisera pas forcément fgetc d'ailleurs je me demande si elle est bufferisée ou pas. Dans le cas de petits fichiers comme nous avons depuis le début à savoir quelques octets cela me paraît suffisant.


    un petit programme pour générer un fichier de tests je suis sûr qu'on peut l'améliorer, on pourrait voir les différentes complexitès pour chaque programme génial

    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
     
    void genfic() {
    char numerique[]={"0123456789"};
            int iter = 100000 * NB_MO;
     
            FILE * fichier = fopen("nombres.txt", "w");
     
            int i;
            for(i=0;i<iter;i++) {
                fwrite(&numerique, 1, sizeof  numerique, fichier);
                printf("generation fichier...\r");
            }
     
     
            fflush(fichier);
            fclose(fichier);
    }
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  14. #34
    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 rafale001 Voir le message
    Par exemple, dans mon fichier txt j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1002003002222200011111
    12300000032000001
    et je veux savoir combien j'ai de chiffres dans ces lignes de code.
    Il me faut ce nombre et le premier chiffre, ici un "1"
    Tu lis caractère par caractères avec fgetc() et tu comptes chaque fois que c'est un chiffre. isdigit() peut aider.
    Pour le premier, tu gères un 'flag' d'état que tu réinitialises à chaque ligne (détection d'un '\n').

    C'est un bête problème d'algorithme. Ce qu'il faut, c'est bien décrire le problème à résoudre, puis en décrire le comportement en texte, puis en pseudo-code. Bref, la procédure habituelle :

    1 - définition
    2 - conception
    3 - codage

    Ca donne :

    1 - Définition :

    "je veux savoir combien j'ai de chiffres dans ces lignes de code.
    Il me faut ce nombre et le premier chiffre"

    2 - Conception

    Mettre un compteur à 0.
    Lire le fichier caractères par caractères.
    Si c'est un chiffre, incrémenter le compteur. Si le compteur vaut 1, afficher le chiffre
    Si c'est la fin de ligne, afficher le compteur, remettre le compteur à 0.

    Soit en pseudo-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
     
    cpt := 0
    FAIRE
     c := INPUT fichier
     SI est_un_chiffre (c)
       INC cpt
       SI cpt = 1
        PRINT c " : " 
       FIN SI
     SINON SI c = EOL
      PRINT cpt EOL
      cpt := 0
     FIN SI
    TANT QUE NON EOF fichier
    Nota : EOL = End Of Line

    3 - Codage

    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
     
    #include <stdio.h>
    #include <ctype.h>
     
    int main (void)
    {
       char const *fname = "test.txt";
       FILE *fp = fopen (fname, "r");
     
       if (fp != NULL)
       {
          int c;
          int count = 0;
          while ((c = fgetc (fp)) != EOF)
          {
             if (isdigit (c))
             {
                count++;
     
                if (count == 1)
                {
                   printf ("%c : ", c);
                }
             }
             else if (c == '\n')
             {
                printf ("%d\n", count);
                count = 0;
             }
          }
          fclose (fp), fp = NULL;
       }
       else
       {
          perror (fname);
       }
       return 0;
    }
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 : 22
    1 : 17
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  15. #35
    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 Tusbar Voir le message
    Et tu penses que fopen fait quoi ? a part retourner un pointeur sur file ?
    Il fait ce pourquoi il a été conçu lors de la définition du langage C.

    La manière de le faire sur ta plateforme (open()) me laisse indifférent. Sur la mienne, c'est FileOpen(). Ca t'intéresse ? Non.

    Le langage commun, ici, c'est le C standard, c'est pas les fonctions système. C'est clair ?
    Pas de Wi-Fi à la maison : CPL

  16. #36
    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 Stabia Voir le message
    J'ai sans doute beaucoup de mauvaises habitudes mais voici comment je traiterais le problème :
    1/ lecture de tout le fichier dans un tampon (rapidité)
    Non. Un fichier peut avoir une taille > à la mémoire disponible. Ici, le traitement est clairement séquentiel et ne nécessite pas de stockage (ou par ligne éventuellement).

    Cette idée naïve que tu as exprimée plusieurs fois sur ce forum est valable pour de petits fichiers, et encore, les données internes sont souvent dans un format différent, il faut donc faire une conversion, ce qui rend inutile de charger tout le fichier original. Une conversion séquentielle est généralement suffisante.

    Quand à la rapidité, les accès en lecture étant bufférisés, je ne vois pas bien ce que ça va changer... Il faut faire des mesures...

    Un appel à fgetc() lit entièrement le secteur concerné. Au pire 2 appels consécutifs lisent 2 secteurs. Une fois les secteurs en mémoire, l'accès (fgetc() suivants) est très rapide.

    Au fait, pas de UCHAR en C standard.
    Pas de Wi-Fi à la maison : CPL

  17. #37
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut
    Je précise que dans mon fichier il devrait y avoir 262 000 chiffres.
    Vous connaissez beaucoup de PC ne disposant pas de cet espace mémoire ?

    Au fait, pas de UCHAR en C standard.
    c'était un moyen commode de remplacer "unsigned char*"

    Cette idée naïve
    peut être, mais efficace dans la plupart des cas pratiques, particulièrement pour les fichiers contenant du texte.

    Je vis de la programmation depuis 1984, et vous ?

    Quand à la rapidité
    entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    car = *ptTampon++;
    et inutile de tester, il suffit de d'afficher le code assembleur !

    il faut donc faire une conversion
    justement ! si la conversion est caractère pour caractère il suffit de le changer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     *ptTampon-1 = nouveauCar
    Enfin, pour tempérer, si votre but est pédagogique, ou que vous pensez que les codes sont souvent portés d'une plate-forme à une autre, vous avez raison de proposer des solutions "pures".

  18. #38
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par Stabia Voir le message
    entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    car = *ptTampon++;
    et inutile de tester, il suffit de d'afficher le code assembleur !
    Des mesures seraient plus parlantes pour la plupart là c'est parler un peu dans le vent...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  19. #39
    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 Stabia Voir le message
    Je vis de la programmation depuis 1984, et vous ?
    Bah 1989, et en C depuis 1993...

    [UCHAR] ... c'était un moyen commode de remplacer "unsigned char*"
    J'espère que tu voulais dire 'unsigned char', sinon, c'est PUCHAR ou UCHARP etc.

    Mais si il s'agit de caractères, le bon type est char et rien d'autre pour être portable. La 'signitude' dépend de l'implémentation.

    En ce qui concerne les problèmes de vitesse (XP/ Intel Celeron M80) :
    Création du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (1365 rec)
    SYSALLOC Successful initialization: 1365 records available
    test.txt: No such file or directory
    262001 caracters written
    done in 0.078 s
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
    FRMWRK.Execution terminated
     
    Press ENTER to continue.
    Décodage :
    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
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
     
    <...>
    6 : 11
    7 : 13
    1 : 11
    3 : 15
    2 : 15
    9 : 16
    7 : 17
    4 : 17
    9 : 17
    0 : 15
    5 : 18
    9 : 11
    9 : 14
    5 : 17
    8 : 13
    7 : 10
    6 : 15
    3 : 17
    3 : 10
    2 : 12
    2 : 17
    4 : 15
    4 : 17
    7 : 10
    3 : 15
    2 : 16
    6 : 19
    1 : 15
    1 : 18
    5 : 14
    1 : 17
    9 : 19
    7 : 10
    1 : 11
    5 : 16
    9 : 13
    9 : 16
    7 : 18
    6 : 12
    5 : 15
    8 : 17
    8 : 11
    6 : 16
    7 : 16
    9 : 10
    6 : 10
    5 : 16
    1 : 14
    0 : 11
    8 : 10
    0 : 12
    5 : 14
    3 : 10
    1 : 11
    7 : 13
    5 : 15
    8 : 15
    2 : 15
    4 : 12
    7 : 15
    2 : 19
    8 : 19
    2 : 10
    3 : 14
    6 : 16
    0 : 15
    6 : 18
    9 : 17
    6 : 12
    3 : 11
    0 : 18
    0 : 12
    4 : 17
    0 : 12
    9 : 13
    3 : 16
    4 : 12
    0 : 13
    8 : 11
    3 : 14
    0 : 13
    4 : 11
    3 : 19
    5 : 13
    0 : 15
    4 : 17
    5 : 10
    1 : 13
    8 : 18
    2 : 12
    4 : 17
    8 : 13
    1 : 15
    0 : 16
    9 : 18
    4 : 17
    1 : 16
    2 : 14
    9 : 11
    4 : 18
    0 : 10
    7 : 17
    5 : 17
    3 : 13
    3 : 18
    1 : 16
    9 : 13
    2 : 19
    6 : 13
    5 : 15
    8 : 13
    4 : 10
    4 : 16
    5 : 14
    2 : 14
    4 : 13
    0 : 14
    9 : 15
    9 : 19
    7 : 16
    7 : 14
    6 : 13
    3 : 17
    5 : 12
    1 : 15
    8 : 18
    2 : 16
    3 : 19
    9 : 15
    7 : 12
    3 : 13
    9 : 19
    6 : 15
    2 : 19
    6 : 17
    3 : 13
    7 : 10
    6 : 15
    0 : 15
    1 : 18
    7 : 12
    9 : 14
    0 : 14
    2 : 19
    3 : 12
    9 : 10
    2 : 16
    6 : 18
    7 : 12
    7 : 18
    7 : 15
    3 : 14
    4 : 11
    1 : 13
    5 : 17
    5 : 12
    5 : 10
    5 : 10
    5 : 18
    7 : 13
    9 : 15
    2 : 15
    0 : 10
    0 : 11
    9 : 19
    4 : 11
    4 : 18
    5 : 16
    1 : 18
    2 : 13
    5 : 19
    1 : 18
    3 : 13
    3 : 16
    6 : 17
    2 : 10
    5 : 14
    3 : 11
    3 : 18
    9 : 10
    6 : 11
    7 : 17
    9 : 11
    3 : 17
    6 : 10
    5 : 19
    9 : 10
    6 : 17
    4 : 10
    4 : 10
    1 : 14
    5 : 19
    2 : 16
    8 : 13
    6 : 17
    1 : 12
    9 : 17
    0 : 13
    8 : 12
    7 : 13
    9 : 14
    1 : 18
    0 : 14
    1 : 15
    0 : 14
    4 : 17
    0 : 12
    6 : 16
    8 : 11
    1 : 19
    9 : 17
    5 : 18
    9 : 11
    2 : 13
    3 : 17
    5 : 12
    6 : 19
    1 : 14
    2 : 19
    2 : 12
    0 : 11
    5 : 13
    8 : 18
    6 : 10
    3 : 15
    3 : 12
    7 : 13
    2 : 16
    5 : 12
    7 : 12
    8 : 16
    1 : 17
    6 : 17
    3 : 14
    3 : 15
    4 : 13
    4 : 11
    4 : 17
    4 : 18
    8 : 12
    3 : 17
    4 : 19
    8 : 14
    0 : 14
    8 : 17
    8 : 17
    4 : 11
    3 : 15
    5 : 10
    3 : 17
    6 : 14
    1 : 15
    9 : 17
    4 : 19
    9 : 10
    5 : 14
    7 : 19
    7 : 19
    6 : 12
    2 : 15
    1 : 19
    7 : 11
    6 : 13
    7 : 14
    1 : 11
    6 : 14
    3 : 13
    3 : 15
    4 : 11
    2 : 10
    4 : 19
    0 : 11
    8 : 12
    5 : 15
    4 : 12
    9 : 13
    5 : 10
    6 : 16
    5 : 10
    9 : 15
    8 : 16
    4 : 18
    3 : 16
    9 : 14
    8 : 11
    7 : 15
    8 : 19
    5 : 18
    9 : 12
    6 : 16
    8 : 11
    8 : 14
    done in 3.156 s
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
    FRMWRK.Execution terminated
     
    Press ENTER to continue.
    Evidemment, je n'ai pas tout dans ma pauvre console Windows... Ce qui est long, c'est évidemment l'affichage et le scrolling...

    au fait, 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
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "ed/inc/random.h"
     
    #include <stdio.h>
    #include <ctype.h>
     
    #if 1
    #define N 262000L
    #else
    #define N 100
    #endif
     
    static void make_file (char const *fname)
    {
       FILE *fp = fopen (fname, "w");
       if (fp != NULL)
       {
          long i = 0;
          int n = 10 + random (10);
     
          do
          {
             int j;
             for (j = 0; j < n; j++)
             {
                fputc ('0' + random (10), fp);
             }
             fputc ('\n', fp);
             i += n;
             n = 10 + random (10);
          }
          while (i < N);
     
          fclose (fp);
          printf ("%ld caracters written\n", i);
       }
    }
     
    int main (void)
    {
       randomize ();
       {
          char const *fname = "test.txt";
          FILE *fp = fopen (fname, "r");
     
          if (fp != NULL)
          {
             int count = 0;
             int c;
             while ((c = fgetc (fp)) != EOF)
             {
                if (isdigit (c))
                {
                   count++;
     
                   if (count == 1)
                   {
                      printf ("%c : ", c);
                   }
                }
                else if (c == '\n')
                {
                   printf ("%d\n", count);
                   count = 0;
                }
             }
             fclose (fp), fp = NULL;
          }
          else
          {
             perror (fname);
             make_file (fname);
          }
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  20. #40
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 82
    Points : 89
    Points
    89
    Par défaut
    Voilà ce que cela donne, j'avais un "_read" sous la main, pour "getc" il empile un argument de moins, mais peu importe.
    C'est dans le "call" que tout se passe,et là c'est pas triste, et plus on 'monte' et plus c'est pire ! "_open", "fopen" ... jusqu'à "createFile"

    Allez à la louche "getc" 700/1000 cycles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    004B1715  push        1    
    004B1717  mov         eax,dword ptr [tp] 
    004B171A  push        eax  
    004B171B  mov         ecx,dword ptr [fichierSource] 
    004B171E  push        ecx  
    004B171F  call        @ILT+350(__read) (49D163h) 
    004B1724  add         esp,0Ch 
    004B1727  mov         byte ptr [car],al
    ici, 10/16 cycles, et encore dans une boucle le compilateur saurait l'optimiser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    004B175B  mov         eax,dword ptr [tp] 
    004B175E  mov         cl,byte ptr [eax] 
    004B1760  mov         byte ptr [car],cl

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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