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 :

Compter le nombre de caractères et de chiffres dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 40
    Par défaut Compter le nombre de caractères et de chiffres dans un fichier
    Bonsoir , je suis entrain de faire un programme pour compter le nombre de caractère et chiffre dans un 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
    15
    16
    17
    18
    int main(int arc ,char *argv[]) {
      FILE *fichier=fopen("text.txt","r");
      int c;
      int chiffre=0;
      int caractère=0;
     
              while(c=!EOF){
                  if(c>=0 && c<=9) {
                        chiffre=chiffre+1;}
                   else {
                      caractère=caractère+1;}
     
                    c=fgetc(fichier);
       } 
     
    fclose(fichier);
    printf("Le nombre de caractère est %d, le nombre de chiffre est %d \n", caractère,chiffre);
    return 0;}
    Lorsque je compile sa me donne 1 chiffre et 74 caractère sachant que le texte est le suivant : Demain nous allons cuisiner, nous avons besoin de 2 oeufs et 1 verre de lait
    Alors qu'il y a 2 chiffre si quelqu'un peut m'aider merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Ton code est très mauvais

    • Apprends à lire les alertes ("warnings" en anglais) du compilateur "warning: parenthèses suggérées autour de l'affectation utilisée comme valeur dans une condition" while(c =! EOF). Cette erreur est quand même énorme
    • Tu ne testes pas si le fichier a été ouvert ou pas
    • Tu oublies de faire un premier fgets avant la boucle while. Ce n'est pas techniquement une grosse erreur, mais comme tu n'initialises pas ta variable c il peut y avoir des surprises
    • Il y a une différence entre les chiffres (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) et les caractères ASCII ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
    • On ne doit pas mettre des accents à tes noms de variables ... et autant faire que se peut de tout écrire en anglais pour des raisons d'encodage ASCII/ MBCS/ Unicode - UTF-8, UTF-16, UTF-32
    • Le mélange déclaration et initialisation est possible que depuis le C99. C'est au gré de chacun, moi je préfère coder à l'ancienne



    Ton code corrigé :
    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 <stdlib.h>
     
     
    int main (int argc, char** argv)
    {
        FILE* file;
     
        file = fopen("text.txt", "r");
     
        if (file != NULL) {
            int c, nb_numbers, nb_chars;
     
            nb_numbers = 0;
            nb_chars   = 0;
     
            c = fgetc(file);
     
            while(c != EOF) {
                if ((c >= '0') && (c <= '9')) {
                    nb_numbers = (nb_numbers + 1);
                } else {
                    nb_chars = (nb_chars + 1);
                }
     
                c = fgetc(file);
            }
     
            fclose(file);
     
            printf("main - Le nombre de caracteres est %d, le nombre de chiffres est %d\n", nb_chars, nb_numbers);
        } else {
            printf("main error - cannot open the file\n");
        }
     
     
        return EXIT_SUCCESS;
    }

  3. #3
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 40
    Par défaut
    Merci beaucoup, je voudrais savoir qu'elle est la différence entre "int c" et "char c" pour la fonction fgetc (retourne le caractère lu dans le fichier si je ne me trompe pas )

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Marwaa45 Voir le message
    Merci beaucoup, je voudrais savoir qu'elle est la différence entre "int c" et "char c" pour la fonction fgetc
    C'est une histoire d'encodage (ASCII/ MBCS/ Unicode - UTF-8, UTF-16, UTF-32) lorsque tu enregistres un fichier avec du texte, il faut faire attention à cet encodage.

    Parce que la fonction fgetc va lire le fichier caractère (8 bits - 1 octet) par caractère (8 bits - 1 octet).
    Mais seul l'encodage ASCII garanti que chaque caractère sera encodé avec 1 octet ... mais cet encodage ne prend pas en compte ni les accents ni les caractères non américain (il n'a que 128 caractères ASCII)
    Par exemple, l'encodage Unicode - UTF-8 peut encoder des caractères entre 1 et 4 octets mais peut encoder tous les caractères de la terre (sauf éventuellement langage ancien/ disparu)

    encodage (ASCII/ MBCS/ Unicode - UTF-8, UTF-16, UTF-32)

    À savoir : Dans l'encodage ASCII, les caractères chiffres sont dans l'ordre. Donc
    • pour passer du caractère au chiffre, il faut juste faire number = c - '0';.
    • pour passer du chiffre au caractère, il faut juste faire c = number + '0';.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Marwaa45 Voir le message
    Merci beaucoup, je voudrais savoir qu'elle est la différence entre "int c" et "char c" pour la fonction fgetc (retourne le caractère lu dans le fichier si je ne me trompe pas )
    La fonction fgetc() retourne le caractère lu oui, mais elle retourne aussi EOF (-1 ou 0xffff) quand elle ne lit plus rien. Mais si tu stockes ce "-1" dans un char, il est alors tronqué en char (0xff). Et là, comment peux-tu alors faire la différence entre 0xff (-1 tronqué) et un éventuel caractère ascii 0xff lu dans le fichier ?
    Donc c doit obligatoirement être plus large que "char" (int). Ainsi tout caractère lu sera dans la plage 0x0000 jusqu'à 0x00ff ce qui permettra de distinguer le cas "-1" (0xffff).

    Sinon foetus dit que ton code est plein de warnings (j'ai pas compilé donc je peux pas dire) mais si c'est vrai il faut absolument les supprimer. Un "warning" c'est grosso-modo un message du compilo qui dit "je ne suis pas certain d'avoir bien compris alors je tente un truc mais si ça marche pas c'est pas ma faute, t'as qu'à être plus clair". Alors si tu veux tenter un code à pile ou face...

    Enfin tu peux optimiser cette syntaxe très très scolaire
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    c = fgetc(file);
    while(c != EOF) {
     	...
    	c = fgetc(file);
    }

    en ceci (plus dans l'esprit C)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while((c=fgetc(file)) != EOF) {
     	...
    }

    Citation Envoyé par foetus Voir le message
    Le mélange déclaration et initialisation est possible que depuis le C99.
    Moi j'aurais même dit depuis C89...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 40
    Par défaut
    merci beaucoup pour vos réponses très bien expliqué .

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Moi j'aurais même dit depuis C89...
    Après recherches Internet la norme C90/ C89 dit qu'on ne peut pas mélanger les déclarations et le code.
    La norme C99
    1. replace la notion de code avec "statement" - la traduction française est ligne de code
    2. autorise le mélange entre les déclarations et donc les lignes de codes.


    Mais une déclaration peut contenir 1 initialisation ou 1 appel de fonction
    Des exemples de déclarations :
    • int c;
    • int c = 36;
    • int c = get_magic_number();

Discussions similaires

  1. Compter le nombre de caractères de chaque ligne d'un fichier
    Par Moi302 dans le forum Shell et commandes POSIX
    Réponses: 7
    Dernier message: 28/12/2012, 10h54
  2. Compter le nombre d'occurrences d'un mot dans un fichier texte
    Par kandro dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 31/12/2011, 15h32
  3. Réponses: 3
    Dernier message: 21/08/2009, 15h16
  4. Réponses: 8
    Dernier message: 15/02/2008, 21h53
  5. Réponses: 8
    Dernier message: 18/01/2005, 10h58

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