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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    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 confirmé
    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 : 40
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    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
    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
    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
    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 ?)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert confirmé
    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 : 40
    Localisation : France, Vienne (Poitou Charente)

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    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
    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
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    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
    Par défaut
    gege2061 n'a pas assez insisté, il FAUT que c soit un int.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    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...
    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.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    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 confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    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 confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 92
    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 confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    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
    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
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

+ 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