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 :

Gros probleme de lecture d'un fichier texte


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Gros probleme de lecture d'un fichier texte
    Voila bon j'ai un fichier texte, et je voudrais recuperer ligne par ligne son contenu, j'utilise un fgets (fgets(buffer, 32000, stream)) et tout ce ke j'ai dans le buffer c'est un truc qui ressemble a rien, et qui a aucun rapport avec ce que contient le fichier..
    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
     
    stream = fopen("4DLogFile2", "rt");
        if(stream == NULL) strcpy(returnValue, "ERR");
        else
        {
            while(!feof(stream))
            {
                fgets(buffer, 32000, stream);
                pos=0;
                while(buffer[pos]!=' ')
                {
                    dateOfLine[pos]=buffer[pos];
                    pos++;
                }
                pos++;
                //test si date ok
                //pas encore implemente
                //on place dans la variable de retour
                while(buffer[pos]!='\0')
                {
                    line[pos]=buffer[pos];
                    pos++;
                }
                line[pos]='\0';
                strcat(returnValue, line);
            }
        }
        printf("%s", returnValue);
    en fait je test pour ensuite implementer dans un plugin 4D, d'ailleurs j'ai un aussi un probleme pour mon plugin meme si je met une valeur a returnValue(qui est la valeur à retourne) ca retourne rien...
    J'en ai marre

  2. #2
    J&B
    J&B est déconnecté
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Tu as bien déclarer avant char buffer[32000]; ?

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    A la place de while(!feof(stream)) met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fgets(buffer, 32000, stdin) != NULL)
    Et juste apres le fgets affiche buffer pour voir ce qu'il y a dedans.

    Je te rappelle que fgets s'arrete quand il trouve un \n alors es tu sur pour tes 32000 de ton buffer?
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    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 Draekonyss
    Voila bon j'ai un fichier texte,
    Sûr ? Tu peux montrer quelques lignes ?
    et je voudrais recuperer ligne par ligne son contenu, j'utilise un fgets (fgets(buffer, 32000, stream)) et tout ce ke j'ai dans le buffer c'est un truc qui ressemble a rien, et qui a aucun rapport avec ce que contient le fichier..
    32000 pour un ligne, c'est du sérieux ! Il est défini comment le tableau de char ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    stream = fopen("4DLogFile2", "rt");
    "rt", ça n'existe pas. C'est "r".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          if(stream == NULL) strcpy(returnValue, "ERR");
    Comment esr défini returnValue ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         else
        {
            while(!feof(stream))
    Non. feof() ne fait pas ce que tu crois. Voir la remarque de Skyrunner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
             {
                fgets(buffer, 32000, stream);
    Comment est défini buffer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                 pos=0;
                while(buffer[pos]!=' ')
                {
                    dateOfLine[pos]=buffer[pos];
                    pos++;
                }
                pos++;
    Il y a des moyens moins barbares pour parser une ligne... (sscanf() etc.)

    Poste le code complet mais minimum qui montre le défaut. On ne peut rien dire de plus avec ça.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    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 : 43
    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
    J'aurais aussi des doutes sur ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stream = fopen("4DLogFile2", "rt");
    Tentes plutôt "r"

    Jc

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Alors :
    le truc c'est que je test un truc pour mettre dans un plugin 4d.
    returnValue est défini comme un char returnValue[32000] (champ texte)
    buffer est bien défini, ma ligne est écrite de cette facon :
    20/2/2005(tabulation ou \t)texte à récuperer\n
    21/3/2005 \t autre texte, blabla...\n

    oui le contenu est bien du texte, je l'ai ecrit moi meme, je peu voir son contenu avec un simple cat <monfichier>
    d'habitude j'utilise fscanf, que je voulais utiliser de cette facon (le stream est peut etre pas au bon endroit dans l'exemple que je vais donner ):
    fscanf(stream, "%s\t%s", date, ligne), avec ligne et date défini en char [].
    j'ai toujours eu du mal avec la lecture des fichiers, ca m'enerve..je peu vous faire des trucs avec des listes chainées de oufs, mais les fichiers....avec moi ca bugg, ca marche jamais...
    si vous pouvez m'aider en m'expliquant quelle methode utiliser avec en gros quoi mettre dans les parametres ca devrait aller, mais bon vu que j'ai pas mes cours ni la bible du C sous la main....je vous demande pas non plus de me filer le code source non plus.
    emmanuel tu parle d'un sscan je sais pas quoi, peut tu m'expliquer la syntaxe??
    au fait je tourne sous mac os x, logikement c'est de l'unix derriere mais je sais pas si y ades trucs ki ont du mal a tourner derriere ou pas..
    voila...merci pour toutes vos reponses en tout cas. la il est 23h30 donc je vais voir ca demain matin et si ca marche pas, ben ca marchera de toute facon faut que ca marche

  7. #7
    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 Draekonyss
    le truc c'est que je test un truc pour mettre dans un plugin 4d.
    Je ne sais pas ce que c'est...
    returnValue est défini comme un char returnValue[32000] (champ texte)
    buffer est bien défini, ma ligne est écrite de cette facon :
    20/2/2005(tabulation ou \t)texte à récuperer\n
    21/3/2005 \t autre texte, blabla...\n
    C'est donc
    <date>TAB<texte>EOL
    C'est bien ça ? Et tu veux récupérer <date> d'un coté et <texte> de l'autre. Et si j'ai bien compris, il n'y a pas de "" autour du texte, et il peut contenir des espaces. C'est bien ça ?
    oui le contenu est bien du texte, je l'ai ecrit moi meme, je peu voir son contenu avec un simple cat <monfichier>
    OK.

    A cause des espaces, on ne peut pas utiliser *scanf().

    On lit les lignes avec fgets().

    " 20/2/2005\ttexte à récuperer\n"

    Ensuite, c'est simple, il suffit de chercher le '\t', (strchr()), de mettre un 0 la place.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    " 20/2/2005\0texte à récuperer\n"
    On a le premier champ (à partit du début).
    Ensuite, on avance de 1, on se rappelle de cette position (début du premier champ)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "texte à récuperer\n"
    on cherche le '\n', on le remplace par un 0 et on a le 2ème champ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "texte à récuperer\0"
    soit
    Terminé.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    En fait c'est pas le parsing de la ligne qui me fait peur, mais merci d'avoir résolu le probleme à ma place, mais c'est juste la récupération de la ligne en elle meme.

    Le parsing je peu me debrouiller, le code sera plus ou moins optimise(plus moins que plus plus)..
    Pour le scanf c'est vrai j'avai completement zappe qu'il s'arreter des qu'il voyait un espace si on met %s...
    Merci.
    La ca a l'air de marcher( je passe par un simple fichier.c et en compilant par gcc sous la console, XCodeTools c'est quand meme en carton un peetit peu quand meme)

    Emmanuel : 4D est une bdd Mac (principalement, meme si une version zindobe existe mtnt), je dois créer deux plugins, le premier qui ecrit et lit dans un fichier de log, et un deuxieme beaucoup plus compliqué avec des indexs...pour info...c'est sympa, mais bon je me rends compte que si on pratique pas un langage on en perd pas mal, et quand on passe du monde de l'education (les cours et tps qu'on a eu) au monde de l'entreprise/professionel, c'est la qu'on voit que ce qu'on nous demande est beaucoup plus pousser. (rien que le parsing on a pas vu ca en cours)

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Draekonyss
    meme si une version zindobe existe mtnt
    Tu veux surement dire Windows

    Au fait tu peux considerablement reduire la taille de tes buffer de 32000...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  10. #10
    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
    Par défaut
    Citation Envoyé par fearyourself
    J'aurais aussi des doutes sur ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stream = fopen("4DLogFile2", "rt");
    Tentes plutôt "r"

    Jc
    Ou "r+" et il faut toujours vérifier la bonne ouverture du fichier.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    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 seriousme
    Ou "r+" et il faut toujours vérifier la bonne ouverture du fichier.
    Pourquoi "r+" ??? Il suffit de tester le retour de fopen, "r" suffit amplement.
    "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

  12. #12
    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 : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                pos=0;
                while(buffer[pos]!=' ')
                {
                    dateOfLine[pos]=buffer[pos];
                    pos++;
                }
    Et si ya pas d'espace dans la ligne lue?

    Personnellement, j'utiliserais pas fgets+feof pour parcourir le fichier mais fgets tout seul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (fgets(buffer, sizeof buffer, stream) != NULL) {
    /* ... */
    }

  13. #13
    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
    heu ... ouvre ton fichier en mode "r" et pas "rt" cela n'existe pas je sais que "rb" pour les fichiers binaire mdr mais faut pas faire la même chose pour les fichier texte . ouf taille du buffer 32000 ben la tes sur de récup toute la ligne hein mdr.
    si il est bien déclarer c'est qu'il est comme ceci :
    char buffer[32000];

    pour parser, utilise plutot sscanf.
    ++

    deck_bsd

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

Discussions similaires

  1. Probleme de lecture d'un fichier texte
    Par souhail2006 dans le forum Débuter
    Réponses: 7
    Dernier message: 29/03/2014, 11h54
  2. [AC-2010] Probleme de lecture d'un fichier texte
    Par Mut dans le forum VBA Access
    Réponses: 0
    Dernier message: 07/01/2013, 16h10
  3. probleme lecture et ecriture fichier texte
    Par shams dans le forum C
    Réponses: 10
    Dernier message: 06/07/2007, 10h46
  4. [C# CF1.1]Probleme de lecture dans un fichier texte
    Par Papy_Guik dans le forum Windows Mobile
    Réponses: 10
    Dernier message: 21/05/2007, 17h43
  5. Probleme de lecture d'un fichier texte
    Par pracede2005 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/03/2007, 13h32

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