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 :

calculer le nombre de lignes d'un fichier txt


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Collégien
    Inscrit en
    Décembre 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2022
    Messages : 2
    Par défaut calculer le nombre de lignes d'un fichier txt
    Bonjour,
    je vous ai envoyé ci-joint un code dont le but est de calculer le nombre de lignes d'un fichier txt pour choisir un mot aléatoire de ce fichier mais le problème est qu'il m'affiche juste des 0 au lieu du nombre de lignes du fichier pays.txt . S'il vous plait pouvez vous m'aider à résoudre ce problème .
    Merci d'avance .
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h> 
    #include <string.h>
    #define test .h
    #define MAX_CHAR 100 
    int calculer(FILE *file) { int counter = 0;
        char *line = malloc(MAX_CHAR*sizeof(char));
    	while(fgets(line,MAX_CHAR,file)!=NULL) { counter++; } 
    	free(line);
    	return counter; } 
     
     
    int main() {FILE*fic=fopen("pays.txt","a");
        int max;
        max=calculer(fic);
        printf("%d",max);
     
     
     
     
    	return 0;
    }

  2. #2
    Membre Expert
    Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 851
    Par défaut
    Hello,

    Tu ouvres ton fichier en mode "a" (append). Tu ne peux donc effectuer que des écritures. Le mode d'ouverture "r" (read) est plus approprié.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par kimobimo25 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *line = malloc(MAX_CHAR*sizeof(char));
    ...
    free(line);
    => char line[MAX_CHAR] (et généralement on écrira MAX_CHAR+1 pour montrer aux autres lecteurs qu'on a conscience de la nécessité du '\0')
    Accessoirement compter le nombre de lignes c'est juste compter le nombre de '\n' => int c; while((c=fgetc(file) != EOF) { if (c == '\n') counter++;}
    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]

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    712
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 712
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Accessoirement compter le nombre de lignes c'est juste compter le nombre de '\n'
    Sous Linux

  5. #5
    Membre Expert
    Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 851
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    Sous Linux
    Non non, sous windows également.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    Sous Linux
    Citation Envoyé par edgarjacobs Voir le message
    Non non, sous windows également.
    En fait, sous Windows, les lignes se terminent par le couple '\r\n' symbolisant le mouvement d'une machine à écrire qui se fait en deux étapes
    • le charriot qui revient au début
    • avancée du papier

    J'irais même jusqu'à formuler l'hypothèse que les fonctions de lecture convertissent en interne ce couple '\r\n' en '\n' ce qui fait que c=='\n' fonctionne aussi. Mais même sans ça, dans '\r' + '\n' il y a quand-même bien '\n' à un moment donné
    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]

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    712
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 712
    Par défaut
    Il me semble aussi que Python aligne systématiquement le line ending sur \n pour la lecture, quelle que soit la plateforme, et donc même sous windows cette méthode est safe (je crois).

    Par contre, dans le cas présent il y a la fonction fgets qui lit jusqu'au prochain \n si je ne m'abuse.
    Donc je ne suis pas sûre qu'un fichier au format DOS/windows çad \r\n sera correctement lu sur une autre plateforme comme Linux. Ou il est possible que chaque ligne soit terminé par un \r invisible. Je conseille de tester la lecture avec un fichier produit sous windows.

    The C library function fgets() is best avoided in binary mode because any file not written with the Unix newline convention will be misread. Also, in text mode, any file not written with the system's native newline sequence (such as a file created on a Unix system, then copied to a Windows system) will be misread as well.
    Source: https://en.wikipedia.org/wiki/Newlin...ming_languages

  8. #8
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 845
    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 845
    Par défaut
    il me semble que sous Mac c'est simplement '\r'.
    Avec PHP, il y a la constante PHP_EOL qui simplifie tout.

    Après 1 petite recherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Windows - Lines end with both a <CR> followed by a <LF> character
    Linux  - Lines end with only a <LF> character
    Macintosh (Mac OSX) - Lines end with only a <LF> character
    Macintosh (old) - Lines end with only a <CR> character

    Édit : Carriage Return Line Feed, lien wikipedia en français
    • le caractère '\n', <LF>/ Line Feed (saut de ligne), n pour "new line"
    • le caractère '\r', <CR>/ Carriage Return (retour chariot)

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    Par contre, dans le cas présent il y a la fonction fgets qui lit jusqu'au prochain \n si je ne m'abuse.
    En réalité pas tout à fait. Dans le cas présent la fonction fgets() lira 100 caractères (en réalité 99 car elle en garde un pour y ranger le '\0'). Effectivement si un '\n' est présent dans ce qui est lu elle s'y arrête même si avant 99 ; mais s'il n'y en a pas (ligne de 150 car. par exemple) elle s'arrêtera alors à 99 qui est sa limite max. Et donc l'algo comptant en réalité les fgets() et non les lignes, en comptera 2 alors qu'il n'y a qu'une ligne réelle.
    Bon soyons honnête, dans 99,999% des cas, 1 fgets() = 1 ligne. Mais il convenait de rappeler qu'il existe 0,001% de risque, risque qui n'existe pas si on code l'algo pour compter les '\n' et non les fgets (hormis si Macintosh old avec sa spécification que je ne connaissais pas).
    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]

  10. #10
    Membre émérite
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    [...]
    J'irais même jusqu'à formuler l'hypothèse que les fonctions de lecture convertissent en interne ce couple '\r\n' en '\n' ce qui fait que c=='\n' fonctionne aussi. Mais même sans ça, dans '\r' + '\n' il y a quand-même bien '\n' à un moment donné
    Bonjour,

    C'est ici que le mode d'ouverture du fichier a une importance :
    • sous Windows il est impératif d'ouvrir le fichier en mode texte pour justement avoir un caractère `\n` pour les paires d'octets 10/13 lus ;
    • Unix et apparenté : on s'en fout.

  11. #11
    Membre Expert
    Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 851
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    C'est ici que le mode d'ouverture du fichier a une importance :
    • sous Windows il est impératif d'ouvrir le fichier en mode texte pour justement avoir un caractère `\n` pour les paires d'octets 10/13 lus ;
    Il me semble que sous windows, l'ouverture d'un ficher se fait par défaut en mode texte. Par contre le 'b' est nécéssaire pour ouvrir le fichier en mode 'binaire", c'est-à-dire sans conversion du 0d0a en \n

  12. #12
    Nouveau candidat au Club
    Femme Profil pro
    Collégien
    Inscrit en
    Décembre 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2022
    Messages : 2
    Par défaut
    D'abord merci beaucoup pour vos réponses .D'après ce que j'ai compris je dois ouvrir mon fichier en mode lecture puis 'utiliser le \n dans mon code c'est ce que j'ai essayé mais j'ai encore le même résultat "le 0 " .Et voici le code que j'ai essayé , pouvez vous m'aider à le résoudre car je dois soumettre ce mini projet le mardi . Merci d'avance .
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h> 
    #include <string.h>
    #define test .h
    #define MAX_CHAR 100 
    int calculer(FILE *file) { int c,counter; while((c=fgetc(file) != EOF)) { if (c == '\n'){ counter++;} } }
     
     
    int main() {FILE*fic=fopen("pays.txt","r");
        int max;
        max=calculer(fic);
        printf("%d",max);
     
    	return 0;
    }

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kimobimo25 Voir le message
    c'est ce que j'ai essayé mais j'ai encore le même résultat "le 0 " .Et voici le code que j'ai essayé
    Et jamais tu ne lui fais retourner de résultat à ta fonction de comptage??? Pourtant tu le faisais dans ton premier code.
    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]

  14. #14
    Membre Expert
    Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 851
    Par défaut
    counter n'est pas initialisé à zéro....
    Et

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 411
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Il me semble que sous windows, l'ouverture d'un ficher se fait par défaut en mode texte. Par contre le 'b' est nécéssaire pour ouvrir le fichier en mode 'binaire", c'est-à-dire sans conversion du 0d0a en \n
    Sous Windows et partout ailleurs. C'est juste que sous les systèmes unixoîdes on ne voit pas la différence (ce qui est une grosse source de bug en cas de portage du code) et le cas Mac on ne le rencontre pratiquement plus depuis OSX.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Calcul du nombre de lignes dans un fichier texte en JavaScript
    Par developppez dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 29/08/2017, 08h13
  2. retourner le nombre de ligne d'un fichier txt
    Par naazih dans le forum Langage
    Réponses: 1
    Dernier message: 26/04/2008, 13h16
  3. Retourner le nombre de lignes d'un fichier txt
    Par El-Diablo- dans le forum C++Builder
    Réponses: 1
    Dernier message: 14/02/2008, 16h25
  4. nombre de lignes dans un fichier .txt
    Par marieo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/10/2007, 15h22
  5. Déterminer le nombre de lignes d'un fichier [.txt]
    Par Metallic-84s dans le forum Langage
    Réponses: 2
    Dernier message: 14/03/2006, 09h34

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