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 :

nombre de ligne d'un fichier texte [Fait]


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    Points : 45
    Points
    45
    Par défaut nombre de ligne d'un fichier texte
    comment faire pour que lorsque l'on ouvre un fichier texte en lecture à l'aide de "fopen", on puisse aussi connaître le nombre de ligne qu'il comporte?

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Il faut compter le nombre de fin de ligne (ie le nombre de retour chariot), ou encore compter le nombre de fois que l'on a pu exécuter fgets.

    En tout cas, en C, il n'y a pas de fonction qui réalise cela directement.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par PRomu@ld
    Il faut compter le nombre de fin de ligne (ie le nombre de retour chariot), ou encore compter le nombre de fois que l'on a pu exécuter fgets.
    Pas fiable, car on peut très bien tomber sur une ligne trop grande pour la chaine de destination.

    Il vaut mieux parcourir avec fgetc() et compter les '\n'. C'est beaucoup plus fiable.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par PRomu@ld
    Il faut compter le nombre de fin de ligne (ie le nombre de retour chariot), ou encore compter le nombre de fois que l'on a pu exécuter fgets.
    Pas fiable, car on peut très bien tomber sur une ligne trop grande pour la chaine de destination.

    Il vaut mieux parcourir avec fgetc() et compter les '\n'. C'est beaucoup plus fiable.
    Est-ce vraiment un problème ? Il faut pister simplement le '\n' àprès chaque fgets.
    Je me pose toujours la questiopn, sans avoir aucune réponse (si tant est qu'il y en a une) la lecture par fgets est-elle plus rapide que la lecture par fgetc si on choisit bien la taille du buffer (BUFSIZE par exemple ?)

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Il faudrait regarder l'implémentation de fgets, mais il y a des chances pour que fgets utilise fgetc ... (je n'en sais strictement rien ...)

    Du coup, pour ce qui est des perfs, ça n'est peut être pas énorme comme différence. (en tout cas tant que les E/S sont bufferisées)

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Trap D
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par PRomu@ld
    Il faut compter le nombre de fin de ligne (ie le nombre de retour chariot), ou encore compter le nombre de fois que l'on a pu exécuter fgets.
    Pas fiable, car on peut très bien tomber sur une ligne trop grande pour la chaine de destination.
    Il vaut mieux parcourir avec fgetc() et compter les '\n'. C'est beaucoup plus fiable.
    Est-ce vraiment un problème ? Il faut pister simplement le '\n' àprès chaque fgets.
    Ce qui est une façon très compliquée de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       n=0;
       while ((c = fgetc(fp)) != EOF)
       {
          if (c == '\n')
          {
             n++;
          }
       }
    (j'ai évité l'ésotérique n += c == '\n'; )
    Je me pose toujours la questiopn, sans avoir aucune réponse (si tant est qu'il y en a une) la lecture par fgets est-elle plus rapide que la lecture par fgetc si on choisit bien la taille du buffer (BUFSIZE par exemple ?)
    Il n'y a pas de réponse générale, car ça dépend de l'implémentation. Il faut faire des mesures.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    merci emmanuel pour le bout de code. J'immagine que "c" doit être une variable de type caractère? Ce code ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FILE *file;
    file=fopen("texte.txt","r");
    char c;
    int n;
    while ((c=fgetc(file)!=EOF)
    {
      if(c=='\n')
      {
      n++;
      }
    }
    lors de la compilation il me dit :"syntax error before '{' token" au niveau de mon "while"

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    Citation Envoyé par mrtatou
    lors de la compilation il me dit :"syntax error before '{' token" au niveau de mon "while"
    Pourquoi avoir enlevé le
    essai ceci :

    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
    #include <stdio.h>
     
    int nb_lignes (FILE *fp)
    {
       int n=0, c;
     
       while ((c = fgetc(fp)) != EOF)
       {
          if (c == '\n')
          {
             n++;
          }
       }
       return n;
    }

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    gege2061 n'a pas assez insisté, il FAUT que c soit un int.

  10. #10
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Trap D
    gege2061 n'a pas assez insisté, il FAUT que c soit un int.
    Là ou moins si c'est pas clair, j'y peux rien, merci

    La raison

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    ok merci.
    bon j'arrive à compter mon nombre de lignes mais du coup quand je met à la suite de mon code mon "gets" ca ne passe plus.
    c'est à dire qu'indépendamment le "gets" passe mais dès que je met au dessus mon code avec le "getc" ca ne fonctionne plus...
    que faire?

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Pour commencer, ne pas utiliser gets(). (cette fonction ne devrait pas exister, utiliser fgets() à la place).

    Ensuite, poste ton code: On pourra essayer de voir ce qui ne va pas...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    voici mon code:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
    int i,c;
    int n=0;
     
    //ouverture du fichier texte
    FILE *file;
    file=fopen("texte.txt","r");
    if (file==NULL)
    {
    printf("impossible d'ouvrir le fichier spécifié");
    }
     
    //compter le nombre de lignes du fichier et stockage dans n
    while (c=fgetc(file)!=EOF)
    { 
    if(c=='\n')
      {
      n++;
      }
    }
    printf ("%d\n",n);
     
    //création du tableau avec n lignes
    char tab1[n][256];
     
    for (i=0;i<=n;i++)
    		{
    fgets(tab1[i],sizeof tab1[i],file);
    		}
    //affichage pour vérification
    for (i=0;i<4;i++)
    		{
    printf ("%s",tab1[i]);
    		}
     
    }

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Voici un warning important:

    test.c:19: warning: suggest parentheses around assignment used as truth value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (c=fgetc(file)!=EOF)
    Devrait être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c=fgetc(file))!=EOF)
    Ensuite, ta fonction main retourne un entier... Il n'y a pas de return dans ton main...

    Un devrait se trouver en dessous de ton printf...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (file==NULL)
    {
    printf("impossible d'ouvrir le fichier spécifié");
    return EXIT_FAILURE;
    }
    et un à la fin du main:

    EDITION: c'est bien sûr 0 à la place du 1!

    Jc

  15. #15
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Une fois que tu as compte tes lignes, tu te trouves a la fin de ton fichier. Si tu veux le lire une deuxieme fois, ligne par ligne, il faut revenir au debut:
    Note que tu peux tout faire en seul passage, en utilisant fgets() et en increment le nombre de lignes a la volee (il faut juste que le tableau de destination soit plus grand que la ligne la plus grande du fichier).

  16. #16
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par fearyourself
    Voici un warning important:

    test.c:19: warning: suggest parentheses around assignment used as truth value
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (c=fgetc(file)!=EOF)
    Le copier/coller n'est pas disponible sur ton système mrtatou?

    Citation Envoyé par fearyourself
    Un coup de fatigue ?

  17. #17
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par fearyourself
    Citation Envoyé par fearyourself
    Un coup de fatigue ?
    Trop... 1000 apologies...

    [délire dû au manque de sucre...]
    Non, j'en ai marre de retourner 0 quand ça marche, je vais modifier le standard!!!!!!!!
    [/Pris un kitkat... Délire dû au manque de sucre fini...]

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    un grand merci à tous!!!!
    je commence enfin à m'en sortir grâce à vous tous....
    je suis désolé de mes erreurs de débutant, je commence la programmation je fai un stage en fait là.

    merci encore

  19. #19
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pense à cliquer sur

    Jc

  20. #20
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par fearyourself
    Citation Envoyé par gege2061
    Citation Envoyé par fearyourself
    Citation Envoyé par fearyourself
    Un coup de fatigue ?
    Trop... 1000 apologies...

    [délire dû au manque de sucre...]
    Non, j'en ai marre de retourner 0 quand ça marche, je vais modifier le standard!!!!!!!!
    [/Pris un kitkat... Délire dû au manque de sucre fini...]
    Tu es sûr de ce que tu dis là ??
    Reprends un peu de sucre

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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. nombre de lignes d'un fichier texte
    Par Franck26 dans le forum C++/CLI
    Réponses: 8
    Dernier message: 25/06/2008, 17h37
  3. Réponses: 13
    Dernier message: 09/01/2008, 13h02
  4. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 16h58
  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