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 :

Déterminer le nombre de lignes d'un fichier texte


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut Déterminer le nombre de lignes d'un fichier texte
    Salut à tous,
    Un fichier texte est à ma disposition, et j'aimerais juste calculer le nombre de ligne qu'il possède, en supposant ne pas connaître ce nombre à l'avance.
    Le problème est que je ne vois pas comment faire.
    Si quelqu'un pouvait m'aider ...
    Merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Malheureusement, tu vas devoir le lire entièrement pour cela.
    Typiquement, le lire en mode texte en comptant le nombre de caractères de fin de ligne ('\n') que tu trouves.
    (et ajouter 1 si le dernier caractère lu n'est pas une fin de ligne, car ça arrive)

    Edit: Wow, double- cette fois-ci...
    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.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,
    Le plus simple est de parcourir le fichier caractère par caractère avec fgetc et de compter les caractères '\n'

  4. #4
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    Tu peux par exemple faire une boucle qui compte le nombre de "\n".

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    j'avais une idée avec quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(fgets(tab[i],50,stdin){
    i++;
    }
    mais après je vois comment lié ça au nombre de lignes.
    Ah oui j'ai omis une précision : le fichier texte comporte un mot par ligne, et tous les mots sont classés dans l'ordre alphabétique.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je pense qu'ici, utiliser fgets() c'est se compliquer la tâche.
    Je conseillerais plutôt un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FILE * fichier = ... ;
    int c;
    int nLignes = 0;
    while((c=fgetc(fichier)) != EOF)
    {
    	if(c=='\n')
    		nLignes++;
    }
    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.

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Superne0 Voir le message
    j'avais une idée avec quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(fgets(tab[i],50,stdin){
    i++;
    }
    mais après je vois comment lié ça au nombre de lignes.
    Ah oui j'ai omis une précision : le fichier texte comporte un mot par ligne, et tous les mots sont classés dans l'ordre alphabétique.
    Si t'es sur que le fichier n'a pas de lignes de plus de 49 caractère saut de ligne compris, ça peut le faire, sinon trouve autre chose

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Et si on veut aussi compter une ligne si le dernier caractère n'est pas un \n :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    FILE * fichier = ... ;
    int c;
    int nLignes = 0;
    int c2 = '\0';
    while((c=fgetc(fichier)) != EOF)
    {
    	if(c=='\n')
    		nLignes++;
    	c2 = c;
    }
    /* Ici, c2 est égal au caractère juste avant le EOF. */
    if(c2 != '\n')
    	nLignes++; /* Dernière ligne non finie */
    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.

  9. #9
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    Tu peux t'inspirer d'un code comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include<stdio.h>
    int main(void)
    {
    int car, NbLigne;
    NbLigne = 0;
    while (( car = getchar()) != EOF)
            if (c == '\n')
            ++NbLigne;
    printf("%d\n", NbLigne);
    return 0;
    }

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Avec le premier code de Médinoc, j'ai une erreur de compilation à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE* fichier = test.c;
    .
    Je pars effectivement qu'une ligne ne contient pas plus de 50 caractères, et qu'il n'y qu'un seul mot par ligne.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En effet, un FILE* ne s'obtient pas comme ça.
    Il faut utiliser la fonction fopen().

    Typiquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FILE * fichier = fopen("test.c", "r");
    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.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Merci à tous pour votre interêt.
    Cela fonctionne parfaitement avec le code de Médinoc ...
    Juste une précision : à quoi correspond EOF ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    EOF est la valeur que retourne fgetc() en cas d'erreur ou de fin du fichier.

    Et bien sûr, il ne faut pas oublier de vérifier que fopen() a marché, ni de fermer le fichier avec fclose().

    C'est là qu'il convient de séparer le code en fonctions:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
     
    int compte(FILE *fichier)
    {
    	int c;
    	int nLignes = 0;
    	int c2 = '\0';
     
    	while((c=fgetc(fichier)) != EOF)
    	{
    		if(c=='\n')
    			nLignes++;
    		c2 = c;
    	}
     
    	/* Ici, c2 est égal au caractère juste avant le EOF. */
    	if(c2 != '\n')
    		nLignes++; /* Dernière ligne non finie */
     
    	return nLignes;
    }
     
    int main(void)
    {
    	FILE *fichier = fopen("test.c", "r");
    	if(fichier != NULL)
    	{
    		int nLignes = compte(fichier);
     
    		printf("Nombre de lignes : %d\n", nLignes);
     
    		fclose(fichier);
    	}
    	else
    		puts("Erreur en ouverture du fichier.");
    	return 0;
    }
    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.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    OK.
    Merci beaucoup pour cette aide !
    C'est pas encore terminé ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 2.X] Déterminer le nombre de lignes d'un fichier excel
    Par olivier.breheret dans le forum Général Python
    Réponses: 3
    Dernier message: 20/05/2015, 09h16
  2. [Débutant] Déterminer le nombre de lignes d'un fichier csv
    Par charouel dans le forum C#
    Réponses: 7
    Dernier message: 14/06/2013, 18h28
  3. Réponses: 7
    Dernier message: 04/06/2008, 14h53
  4. 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
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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