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 :

connaitre le nombre de caractère dans un fichier


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut connaitre le nombre de caractère dans un fichier
    Bonjour a tous,

    je voudrais savoir comment connaitre le nombre de caractère contenu dans un fichier en langage c
    comme l'exemple du fichier joint
    merci d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Une première réponse brutale, tu regardes la taille du fichier (56 dans ton exemple) et c'est le nombre de caractères de ton fichier.

    Mais je suppose que tu veux la jouer plus fin et ne pas comptabiliser les retour chariot par exemple.

    Dans ce cas, il faut lire le fichier caractère par caractère et compter ceux que tu veux comptabiliser.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Développeur C#, Python, dans la carte à puce
    Inscrit en
    Mars 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C#, Python, dans la carte à puce
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 46
    Par défaut
    Bonjour, voici un petit exemple pour lire un fichier et compter le nombre de caractères (espaces, retours charriots compris):

    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
     
    #include <stdio.h>
     
    int main(int argc, char ** argv) {
     
     int compteur = 0;
     FILE * file;
     
     /* ouverture du fichier */
     if ((file = fopen("ematrix.txt", "r")) == NULL)
      perror("Erreur à l'ouverture du fichier");
     
     else {
       /* parcours du fichier */
       while(fgetc(file) != EOF)
        compteur ++; /* incrémentation du compteur */
     }
     
     printf("Le nombre de caractères du fichier est de : %d\n", compteur);
     
     /* fermeture du fichier */
     fclose(file);
     
     return 0;
    }
    J'espère avoir pu t'aider. Charge à toi de l'adapter.

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut connaitre le nombre de ligne et classer le contenu par ordre alphabetique
    merci pour votre reponse,

    et si je veux connaitre le nombre de ligne et classer le contenu du fichier par ordre alphabetique, comme l'exemple du fichier joint.
    merci d'avance
    Fichiers attachés Fichiers attachés

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Pour compter le nombre de lignes, tu peux compter le nombre de '\n' dans le fichier...

    Pour le tri, qsort peut faire l'affaire.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par mipou Voir le message
    et si je veux connaitre le nombre de ligne
    Même réponse que précédent sauf que ce coup ci, tu compte les retours chariots

    Citation Envoyé par mipou Voir le message
    et classer le contenu du fichier par ordre alphabetique, comme l'exemple du fichier joint.
    • Lire le fichier ligne par ligne
    • stocker en mémoire toute les lignes
    • trier les lignes stockées en mémoire (il va falloir que tu définisse ta fonction de tri, tri alphabétique, tri croissant sur la 3eme colonne puis décroissant sur la 5eme colonne, toutes les fantaisies sont possibles)
    • re écrire le fichier en ecrivant les lignes triées
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut connaitre le nombre de ligne et classer le contenu par ordre alphabetique
    merci encore,
    un exemple en code ne me fera pas du mal.
    merci d'avance

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    A un moment, il faut se lancer et remonter les manches. Tu as déjà pas mal d'idées et de code dans ce post.

    Présente nous ce que tu as fais et on t'aidera
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre averti
    Profil pro
    Développeur C#, Python, dans la carte à puce
    Inscrit en
    Mars 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C#, Python, dans la carte à puce
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 46
    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
     
    #include <stdio.h>
     
    int main(int argc, char ** argv) {
     
     /* tableau de tri */
     char tab[100][1024];
     /* compteur de caractères */
     int compteur = 0;
     /* compteur de lignes */
     int cptLigne = 0;
     /* compteur de caracteres dans une ligne */
     int cptCarLigne = 0;
     /* fichier */
     FILE * file;
     /* caractère récupéré */
     int car;
     
     int i = 0;
     
     /* ouverture du fichier */
     if ((file = fopen("ematrix.txt", "r")) == NULL)
      perror("Erreur à l'ouverture du fichier");
     
     else {
       /* parcours du fichier */
       while((car=fgetc(file)) != EOF){
        compteur ++; /* incrémentation du compteur */
        cptCarLigne ++;
        if (car == "\n"){
         tab[cptLigne][cptCarLigne-1] = "\0";
         cptLigne ++;
         cptCarLigne = 0;
        }
     
        tab[cptLigne][cptCarLigne-1] = car;
     }
     
     /* Appel de ta fonction tri */
     tri(tab);
     
     printf("Le nombre de caractères du fichier est de : %d\n", compteur);
     
     /* fermeture du fichier */
     fclose(file);
     
     /* Ecriture dans le fichier */
     if ((file = fopen("ematrix.txt", "w")) == NULL)
      perror("Erreur à l'ouverture du fichier");
     
     for (i; i < cptLigne; i ++)
     {
       fprintf(file, "%s", tab[cptLigne]);
     }
     
     fclose (file);
     return 0;
    }
    Ce code, bien sûr est à améliorer/corriger en prenant garde aux effets de bords, à la syntaxe et aux fonctions que j'utilise de tête.

    Pour le tri, tu peux voir ici :
    http://c.developpez.com/sources/?pag...HME_tri_rapide

  10. #10
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par gwenBZH Voir le message
    Ce code, bien sûr est à améliorer/corriger en prenant garde aux effets de bords, à la syntaxe et aux fonctions que j'utilise de tête.
    En gros, autant éviter de le lire quoi...
    tu m'expliqueras un jour le concept de nombre négatif de ligne, ou de nombre de caractère négatif dans un fichier, ça m'intéresse.
    et je ne parle pas du fait de mettre une chaine dans un caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (car == "\n"){ /* <= are you crazy???? */
         tab[cptLigne][cptCarLigne-1] = "\0"; /* <= WTF? */

  11. #11
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut comment recuperer chaque ligne d'un fichier pour le mettre dans un tableau
    Bonsoir a tous;
    comment recuperer chaque ligne d'un fichier pour ensuite le mettre dans un tableau
    merci d'avance

  12. #12
    Membre averti
    Profil pro
    Développeur C#, Python, dans la carte à puce
    Inscrit en
    Mars 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C#, Python, dans la carte à puce
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 46
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    En gros, autant éviter de le lire quoi...
    Merci de ton intervention. Super constructive, pleine de respect et d'humilité.

    Je ne suis pas là pour écrire le code de mipou, juste lui donner des pistes pour qu'il puisse de lui-même résoudre son problème.

    Je précise donc que mon code n'est pas à suivre à la lettre mais plus à voir comme un squelette.

    Confondre les quotes " et ' : je suis sincèrement désolé.

    Citation Envoyé par nicolas.sitbon Voir le message
    tu m'expliqueras un jour le concept de nombre négatif de ligne, ou de nombre de caractère négatif dans un fichier, ça m'intéresse.
    Toujours pas compris. Si tu parles de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[cptLigne][cptCarLigne-1]
    mes compteurs sont incrémentés avant d'arriver sur cette ligne. Ils sont incrémentés une fois de trop. Je suis désolé de pas avoir écrit un code optimisé.

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par mipou Voir le message
    Bonsoir a tous;
    comment recuperer chaque ligne d'un fichier pour ensuite le mettre dans un tableau
    merci d'avance
    Tu utilises fgets() et tu prévois suffisamment d'espace dans ton tableau pour y stocker la chaîne entière.

  14. #14
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Par défaut classé les chaines presents dans un fichier
    bonjour a tous,

    mon code en pièce-joint permet de compter et afficher les lignes d'un fichier.
    maintenant je veux classer les lignes par ordre alphabétique.
    comment pourrai-je procéder pour classer le contenu du fichier, qui se presente comme suit:

    mipou
    yoda
    abiba
    kassouya
    gmahan
    doss

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(){
     
    	char tab_ligne[15][9];
    	int nb_lignes,i;
    	char ligne_lue[512];
    	char nom_fic[255];
     
    	FILE * file;
     
      if ((file = fopen("ematrix.txt", "r")) == NULL){
     
      perror("Erreur a l'ouverture du fichier pour lecture...");
      }
      printf("Ouverture du fichier %s\n", nom_fic);
     
      // compter et afficher les lignes du fichier
     
        nb_lignes = 0;
        while(fgets(ligne_lue,512,file) != NULL){
     
        	printf("\t%s", ligne_lue);
          nb_lignes++;
        }
     
        printf("\nle fichier %s comporte %d lignes\n", nom_fic, nb_lignes);
        printf("le fichier est en train de se fermer......");
        fclose(file);
       return 0;
     
       for(i=0;i<=nb_lignes;i++){
     
     
       }
    }
    merci d'avance

  15. #15
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Voilà un exemple, qui peut être améliorer:
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    #define FILENAME       "ematrix.txt"
    #define INCREMENT_SIZE 10
    #define BUFFER_SIZE    BUFSIZ
     
    /**
     * @fn static int compare (void const * a, void const * b)
     * @frief used to sort lines (called by qsort)
     */
    static int compare (void const * a, void const * b)
    {
       return strcmp(*(char const * const *) a, *(char const * const *) b);
    }
     
    int main(void)
    {
       FILE * file = fopen(FILENAME, "r");
     
       if(file == NULL)
       {
          perror("Can't open " FILENAME);
       }
       else
       {
          unsigned long nb_lignes = 0; /** number of lines stored in tab */
          size_t old_len = 0; /** used if line > BUFFER_SIZE */
          size_t current_size = 0; /** size of tab in lines */
          char ** tab = NULL; /** tab of lines */     
          char buffer[BUFFER_SIZE];
     
          puts(FILENAME " opened");
     
          while(fgets(buffer, sizeof buffer, file) != NULL)
          {
             size_t const buf_len = strlen(buffer);
     
             printf("%s", buffer);
     
             /** check if there is place in tab to store new line, if condition is true, there isn't enough place */
             if(nb_lignes == current_size) 
             {
                size_t new_size = current_size + INCREMENT_SIZE;
                char ** tmp = realloc(tab, new_size * sizeof *tmp);
     
                if(tmp == NULL)
                {
                   perror("realloc");
                   break;
                }
                else
                {
                   tab = tmp;
     
                   for(size_t i = current_size; i < new_size; i++)
                   {
                      tab[i] = NULL;
                   }
     
                   current_size = new_size;
                }
             }
     
             /** if it is a new line, realloc acts like malloc, otherwise, we are in the case where line length
                 is greater than buffer length, so we realloc */
             char * tmp = realloc(tab[nb_lignes], (old_len + buf_len + 1) * sizeof *tmp);
     
             if(tmp == NULL)
             {
                perror("realloc");
                break;
             }
             else
             {
                tab[nb_lignes] = tmp;
     
                /** if it is a new line, old_len is 0 and strcpy acts as usual, if the line length is greater,
                    old_len provides the old length of line, and strcpy acts like strcat */
                strcpy(tab[nb_lignes] + old_len, buffer);
             }
     
             /** here, we determine if line length is greater than buffer length */
             if(tab[nb_lignes][old_len + buf_len - 1] == '\n')
             {
                nb_lignes++;
                old_len = 0;
             }
             else
             {
                old_len += buf_len;
             }
          }
     
          printf("\nle fichier " FILENAME " comporte %lu lignes\n", nb_lignes);
     
          qsort(tab, nb_lignes, sizeof *tab, compare); /** sort lines here */
     
          for(size_t i = 0; i < current_size  &&  tab[i] != NULL; i++)
          {
             printf("%s", tab[i]);
             free(tab[i]), tab[i] = NULL;
          }
     
          free(tab), tab = NULL;
          fclose(file), file = NULL;
       }
     
       return 0;
    }

  16. #16
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    j'ajoute que sur sytèmes unixoides la commande wc (wc = word count) fait tout ça toute seule

Discussions similaires

  1. [WD10] connaitre le nombre de caractères dans une chaine
    Par elscorpio dans le forum WinDev
    Réponses: 3
    Dernier message: 27/07/2010, 09h36
  2. Réponses: 4
    Dernier message: 16/12/2009, 14h39
  3. Réponses: 10
    Dernier message: 09/02/2008, 11h40
  4. nombre de caractères dans un fichier
    Par rico3434 dans le forum Linux
    Réponses: 10
    Dernier message: 20/09/2007, 21h58
  5. Connaitre le nombre de caractère ";" dans un champ
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/11/2004, 17h36

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