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
    Points : 1
    Points
    1
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 676
    Points : 1 710
    Points
    1 710
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    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 735
    Points : 31 060
    Points
    31 060
    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++;}

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

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

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    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 735
    Points : 31 060
    Points
    31 060
    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é

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 675
    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 675
    Points : 10 689
    Points
    10 689
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    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 735
    Points : 31 060
    Points
    31 060
    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).

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

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 676
    Points : 1 710
    Points
    1 710
    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
    Points : 1
    Points
    1
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    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 735
    Points : 31 060
    Points
    31 060
    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.

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

    Informations professionnelles :
    Activité : Développeur informatique

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

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    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.

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, 09h13
  2. retourner le nombre de ligne d'un fichier txt
    Par naazih dans le forum Langage
    Réponses: 1
    Dernier message: 26/04/2008, 14h16
  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, 17h25
  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, 16h22
  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, 10h34

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