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 :

Question :fichier texte en C ?


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Question :fichier texte en C ?
    bonjour à tous,

    je voudrais faire un programme qui permet d'afficher des statistiques sur un fichier texte dont le nom est entré par l'usager le programme doit :
    1 -saisir le nom d'un fichier( )
    2.afficher
    -la taille du fichier
    -le nombres des lignes dans le fichier
    -le nombre que le caractère S se trouve dans le fichier ( )

    je me bloque sur la taille et nombres de lignes ,

    Q: existe-t-il une fonction en C qui permet de retourner la taille d'un fichier texte ?
    si oui est-elle ftell(fichier) ?

    et aussi pour la taille je crois que je dois conter toutes les caractères après je le multiplie par 8 pour avoir (la taille en octets) ..?

    merci (je suis débutant ) SVP soyez concis dans vos réponse .

  2. #2
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    Salut

    Tu dois ouvrir le fichier et le parcourir caractere par caractere grace à fgetc()
    Ainsi tu pouras avoir le nombre de caracteres total, le nombre de sauts de ligne, et le nombre de S

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    alors pour les fichiers, je te conseillerais de lire ceci : http://c.developpez.com/faq/c/?page=fichiers ensuite, pour avoir la taille d'un fichier texte en octet, il te suffit de compter le nombre de caractère, si tu multiplie par 8, tu auras la taille en bits (c'est TRES PEU utile pour ne pas dire complètement inutile )
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Gruik
    Salut

    Tu dois ouvrir le fichier et le parcourir caractere par caractere grace à fgetc()
    Ainsi tu pouras avoir le nombre de caracteres total, le nombre de sauts de ligne, et le nombre de S
    oui je vais avoir le nombre de caracteres total et le nombre de S mais comment avoir le nombres de lignes ?

  6. #6
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    Compte le nombre de sauts de ligne + 1

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Pour les caractères s, la tu na pas d'autre choix que parcourire tous ton fichier avec fgetc. Mais je conseil tous de même de charger tous le contenut du fichier dans un buffer (et en plus cela te permet de compter le nombre de lignes en mm temps c'est pas beau ça? mdr ), car l'accès mémoire est beaucoup plus rapide que l'accès fichier , donc se sera plus rapide pour la recherche.

    Pour ce qui est de la taille du fichier , si tu est sous win -> api -> GetFileAttributesEx() . Pour l'utilisation , tous est dit sur la msdn.

    heu pourquoi mutiplié par 8. tu a la chance que se soit un fichier texte Car un caractères = 1 octet, si tu compte combien tu en à , ho magique c'est pile la taille de ton fichier. Mais c'est vraiment pas la bonne solution. utilise l'API.

    ++
    ++

    deck_bsd

    /*************************************/
    [http://dckapps.azurewebsites.net/]

  8. #8
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    Ou de faire une boucle en lisant block par block avec fread
    C'est plus rapide, mais plus complexe

  9. #9
    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 : 67
    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 deck_bsd
    Mais je conseil tous de même de charger tous le contenut du fichier dans un buffer, car l'accès mémoire est beaucoup plus rapide que l'accès fichier , donc se sera plus rapide pour la recherche.
    Un buffer de quel taille ?
    Quel intérêt puisque le problème
    • la taille du fichier
    • le nombres des lignes dans le fichier
    • le nombre que le caractère S se trouve dans le fichier
    peut être résolu en une seule lecture byte par byte ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    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 : 67
    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 Gruik
    Ou de faire une boucle en lisant block par block avec fread
    C'est plus rapide, mais plus complexe
    Pourquoi c'est plus rapide ? Quand on demande la lecture d'un byte, le système charge un secteur entier en mémoire. Même si ce n'est pas le cas et que la lecture est bufferisée, le C demande un bloc de taille BUFSIZ (ou autre si on a utilisé setbuf() ou setvbuf()) au système, bloc qui est chargé en mémoire. Les autres accès byte se feront dans cette mémoire.

    Ce qui est catastrophique (si le système ne bufferise pas l'accès aux secteurs) c'est d'appeler la fonction système (read(), ReadFile()) pour lire 1 byte.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    C'est plus rapide car pour un fichier de N octets, il y a N appels à fgetc
    Et les appels aux fonctions, c'est long
    Mais bon, dans ce cas ci, il vaut mieux favoriser la simplicité et utiliser fgetc

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Emmanuel Delahaye : Et bien vu que un fichier texte se lit séquancielement, tu lit ligne par ligne pour mettre dans un buffer , donc tu fait un compteur en mm temps qui compte combien de fois tu lit, ça cela répond a une des question et pour la lecture , je suis daccord avec toi, lire byte a byte mais dans le buffer et non dans le fichier, lire caractères par caractères dans un fichier est moin rapide que de lire caractères par caractères dans un buffer en mémoire (pas lire mais compter).
    ++

    deck_bsd

    /*************************************/
    [http://dckapps.azurewebsites.net/]

  13. #13
    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 : 67
    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 Gruik
    C'est plus rapide car pour un fichier de N octets, il y a N appels à fgetc
    Et les appels aux fonctions, c'est long
    Une macro qui va bricoler dans la structure FILE... laisse tomber...
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    C'est pas une macro

    (d'apres stdio.h)

    Nan mais c'est pas tres long, mais sur plusieurs centaines de millions d'appels, ça peut se sentir.
    Il y a les parametres à empiler, l'adresse de retour, le pointeur de pile à modifier, le pointeur de code à positionner, et pour le retour, la valeur de retour à placer, le pointeur de pile à descendre, le pointeur de code à repositionner

  15. #15
    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 : 67
    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 Gruik
    C'est pas une macro

    (d'apres stdio.h)
    getc() alors (macro, inline, niveau perf, c'est pareil...) :

    Juste en dessous :
    Citation Envoyé par MinGW
    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
     
    /* Traditionally, getc and putc are defined as macros. but the
       standard doesn't say that they must be macros.
       We use inline functions here to allow the fast versions
       to be used in C++ with namespace qualification, eg., ::getc.
     
       _filbuf and _flsbuf  are not thread-safe. */
    _CRTIMP int __cdecl    _filbuf (FILE*);
    _CRTIMP int __cdecl    _flsbuf (int, FILE*);
     
    #if !defined _MT
     
    __CRT_INLINE int __cdecl getc (FILE* __F)
    {
      return (--__F->_cnt >= 0)
        ?  (int) (unsigned char) *__F->_ptr++
        : _filbuf (__F);
    }
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    Ah bein j'ai po la meme chose
    Citation Envoyé par stdio.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Read a character from STREAM.  */
    extern int fgetc (FILE *__stream) __THROW;
    extern int getc (FILE *__stream) __THROW;

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    L'inconvénient de ces macros, c'est qu'elles empêchent FILE d'être un vrai type abstrait de données...
    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.

  18. #18
    Membre expérimenté
    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
    Points : 1 729
    Points
    1 729
    Par défaut
    Bah apparament, c'est que sous MingW

Discussions similaires

  1. [Débutant] Question Programmation sous WindowsCE et performances fichiers texte
    Par koluche dans le forum VB.NET
    Réponses: 7
    Dernier message: 30/06/2011, 09h51
  2. Questions : Ecriture dans un fichier texte + utilisation d'un logiciel
    Par Djinner² dans le forum Persistance des données
    Réponses: 3
    Dernier message: 18/06/2008, 14h15
  3. Réponses: 2
    Dernier message: 19/05/2008, 10h34
  4. Question sur lecture d'un fichier text en Java
    Par ovcrash dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 27/11/2007, 17h14
  5. Question bête: accés concurent à un fichier texte
    Par djynwk dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2006, 00h54

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