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 :

lire plusieurs lignes d'un fichier et les formater dans un tableau


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 56
    Points : 32
    Points
    32
    Par défaut lire plusieurs lignes d'un fichier et les formater dans un tableau
    Bonjour

    j'ai une fonction qui m permet de lire une ligne dans un 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
     
    void readMem(gchar *ligne, int numLigne){
     
    	FILE *fp = NULL;
    	gchar buf[81];
    	int cpt = 0;
     
    	fp = fopen("/proc/meminfo", "r");
    	while(fgets (buf, 80, fp)){
          if (cpt == numLigne){
             strcpy(ligne, strstr(buf, ":") +7);
             break;
          }
          cpt++;
       }
    	fclose(fp);
    }
    j'ai cree une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct memInfo{
    	gchar	*memTotal;
    	gchar	*memFree;
    }memInfo;
    et cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void getMemInfo(gchar *label){
     
    	/* Recupere les informations de la memoire
    	*/
    	memInfo m;
    	readMem(m.memTotal, 0);
    	readMem(m.memFree, 1);
     
    	strcat(label, "Memoire Total: ");
    	strcat(label, m.memTotal);
    	strcat(label, "Memoire Libre: ");
    	strcat(label, m.memFree);
    }
    en gros dans ma fonction main():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    gchar			*pMemInfo;	
     
    getMemInfo(pMemInfo);
    contOnglet = g_strdup_printf(pMemInfo);
    donc voila j'aimerai pourvoir lui passer mon tableau avec les info du fichier

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    j'ai pas compris la question ...
    mais y me semble que t'as oublié ET la question ET d'allouer de l'espace pour pMemInfo.

    que se passe t-il en ce moment? vous prenez tous des cours de rattrapage avec le même prof?
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fp = fopen("/proc/meminfo", "r");
    "fopen" peut échouer:
    "fgets" lit n-1 caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fgets (buf, sizeof(buf), fp))
    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
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    A première vu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    memInfo m;
    readMem(m.memTotal, 0);
    readMem(m.memFree, 1);
    menTotal et memFree ne sont pas alloué.

    et de meme pour pMemInfo

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct memInfo{
    	gchar	*memTotal;
    	gchar	*memFree;
    }memInfo;
    "memTotal" et "memFree" ne sont que des pointeurs, pas des tableaux.
    Donc soit:
    -on les garde pointeur et on les fait pointer sur une zone mémoire valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (cpt == numLigne){
             ligne=strstr(buf, ":") +7;
             break;
          }
    -on en fait des tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct memInfo{
    	gchar	memTotal[256];
    	gchar	memFree[256];
    }memInfo;
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (cpt == numLigne){
             strcpy(ligne, strstr(buf, ":") +7);
             break;
          }
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    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
    Ceci est un bug vicieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (cpt == numLigne){
             ligne=strstr(buf, ":") +7;
             break;
          }
    En effet on fournit à ligne l'adresse d'un buffer donc 2 possibilités:
    Soit ce buffer est global, mais en cas d'utilisations multiples de ce buffer, ne sera conservée que la dernière information lue, donc on aura une plainte du type : "Je ne comprends pas, j'ai toujours la même information affichée".
    Soit ce buffer est local à la fonction de lecture et au sortir de la fonction cette adresse ne sera plus valide et à l'affichage il pourra se passer n'importe quoi.
    Cette méthode est donc à proscrire absoulment.
    Le mieux dans ce cas est d'utiliser un strdup (ou d'écrire l'équivalent).
    D'autre part, il faudrait peut-être tester le retour de strstr, on ne sait jamais.
    "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

  7. #7
    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
    Ceci est un bug vicieux :
    En fait j'ai déclaré "buf" ainsi:
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    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
    Tu le réinitialises à chaque lecture ? De toute façon l'adresse de buf n'est pas mémorisé par cette action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne=strstr(buf, ":") +7;
    Comment fais-tu pour libérer la mémoire ?
    "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

  9. #9
    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
    Tu le réinitialises à chaque lecture ?
    Ou est le problème?
    A chaque fois la zone mémoire pointée est différente.
    [EDIT]Ah! Pour la libération de la mémoire?[/EDIT]
    De toute façon l'adresse de buf n'est pas mémorisé par cette action
    Pas celle de buf mais celle de l'élément à "buf"+7
    Comment fais-tu pour libérer la mémoire ?
    Il faudrait sauvegarder dans un tableau les adresses des zones allouées, ce qui n'est pas pratique.

    Ce n'est pas une solution optimale en effet.
    Si tu as une idée.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    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
    strdup déjà mentionné
    "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

  11. #11
    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
    Ca ne va pas poser les mêmes problèmes?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  12. #12
    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
    A la fin de l'utilisation des structures il les libères par des free, si j'ai bien compris le problème, il fait un free(m.memTotal) et un free(m.memFree), mais c'est vrai que je n'ai pas tout suivi.
    "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

  13. #13
    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
    Le plus simple est de faire une structure de tableaux statiques pour éviter les problèmes d'allocation dynamique.
    Et à priori il n'est pas nécessaire de changer le reste du code.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

Discussions similaires

  1. lire plusieurs lignes d'un fichier csv
    Par beyo dans le forum Langage
    Réponses: 3
    Dernier message: 14/01/2014, 18h26
  2. Réponses: 6
    Dernier message: 02/12/2010, 22h04
  3. Réponses: 1
    Dernier message: 15/12/2008, 19h50
  4. Réponses: 9
    Dernier message: 05/11/2007, 11h05
  5. Réponses: 3
    Dernier message: 26/04/2004, 12h51

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