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++Builder Discussion :

Les fichiers .INI, lire toutes les informations d'une section


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 83
    Points : 55
    Points
    55
    Par défaut Les fichiers .INI, lire toutes les informations d'une section
    Bonjour tout le monde,

    Je suis entrain de créer une application qui doit lire un fichier .INF.
    Cependant je dois lire une section qui contient ce qui suit :


    [HardwareIds.scsi.BUSDRV]
    id = "PCI\VEN_10DE&DEV_008E", "nvatabus"
    id = "PCI\VEN_10DE&DEV_0085", "nvatabus"
    id = "PCI\VEN_10DE&DEV_00D5", "nvatabus"
    id = "PCI\VEN_10DE&DEV_00EE", "nvatabus"
    Pour cela je fais :
    Ini->ReadSectionValues("HardwareIds.scsi.BUSDRV",LBSata->Items);

    (où LBSata est un TListBox)

    Comme c'est la même variable => id et des valeurs différentes
    Il lit cette secion comme suit :
    [HardwareIds.scsi.BUSDRV]
    id = "PCI\VEN_10DE&DEV_008E", "nvatabus"
    id = "PCI\VEN_10DE&DEV_008E", "nvatabus"
    id = "PCI\VEN_10DE&DEV_008E", "nvatabus"
    id = "PCI\VEN_10DE&DEV_008E", "nvatabus"
    Comment pourrais-je procéder pour qu'il lit comme je veux ?

    Parce que je ne vois pas d'autres solutions à cette heure-ci.

    Merci pour votre future réponse constructive

    PS:

    j'ai inventé une solution mais si quelqu'un a une meilleure solution je suis prenant :

    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
     
    TMemoryStream* pms = new TMemoryStream();
    pms->LoadFromFile ("c:\\txtsetup.oem");
    pms->Seek(0,soFromBeginning);
    char  *Buffer = new char [pms->Size];
    pms->ReadBuffer(Buffer, pms->Size);
    int i=0;
    AnsiString buf = AnsiString(Buffer);
    while ( (buf.SubString(0,buf.AnsiPos("\r\n")).LowerCase().Trim()!="[hardwareids.scsi.busdrv]") && (buf.Length()>10))
    {
      buf=buf.SubString (buf.AnsiPos("\r\n")+1,buf.Length());
    }
      buf=buf.SubString (buf.AnsiPos("\r\n")+1,buf.Length());
    while ( (buf.SubString(0,buf.AnsiPos("\r\n")).LowerCase().Trim().AnsiPos("[")==0) && (buf.Length()>10))
    {
      buf=buf.SubString (buf.AnsiPos("\r\n")+1,buf.Length());
      ShowMessage(buf.SubString (0,buf.AnsiPos("\r\n")));
    }

  2. #2
    Inactif  
    Avatar de Kerod
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    11 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 11 672
    Points : 20 778
    Points
    20 778
    Par défaut
    voilà un petit truc :Ini

    Sinon le fait que tu appelles plusieurs clé par le même nom doit poser un problème, non ???

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour,
    le problème est que les fichiers sont au format unicode et les objects VCL pour la manipulation des fichiers .Ini ne fonctionnent pas vraiment bien
    ci-joint également une solution écrivant le contenu d'un fichier .inf dans un mémo par Parsing.

    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
     
    AnsiString Tmp;
      AnsiString Path;
      AnsiString nBuffer;
      Path=ExtractFilePath(ParamStr(0))+"3dfxvs2k.inf";             // localisation du fichier
      TFileStream* mFile= new  TFileStream(Path,fmOpenRead);        // Chargement dans un Stream
      wchar_t* Buffer=new wchar_t[mFile->Size+1];                   // creation d'un Buffer
      mFile->Read(Buffer,mFile->Size);                              // écriture dans le Buffer
      nBuffer=WideCharLenToString(Buffer,mFile->Size);              // Transformation Unicode en carctère normal
      delete  mFile;                                                // Suppression du Stream
      TStringList* mList =new   TStringList();                       // Création de la liste des strings
      TIniFile* mini = new TIniFile(Path);                // Création Object IniFile
      TStringList* msec= new   TStringList();            // création de la  liste des Sections
      mList->Text=nBuffer;                        // Transfert de la conversion dans object Liste
      mini->ReadSections(msec);                    // Initialisation des sections
      mmo1->Lines->BeginUpdate();                    // on empêche le raffraichissement du Memo
      for(int n=0;n<msec->Count;n++)                // Itération sur la Liste des sections
       {
         Tmp="[";                            // formatage de la section [section]
         Tmp+=msec->Strings[n];                    //
         Tmp+="]";                            //
         mmo1->Lines->Add(Tmp);                    // introduction de la section dame le Memo
         int FirstPos=mList->IndexOf(Tmp);                // recherche de la section dans la liste
         while (FirstPos !=-1)                     // tant que Position Trouvée
         {
           FirstPos++;                        // Position du String Suivant
           Tmp=mList->Strings[FirstPos];
           if ((Tmp.SubString(1,1)=="[")||(FirstPos>=mList->Count-1))//test si Fin de liste ou début d'une nouvelle section
           break;
           mmo1->Lines->Add(Tmp);                    // introduction des strings dans le Mémo 
         }
       }
       mmo1->Lines->EndUpdate();                    // autorisation d'affichage du Memo
       delete []Buffer;                        // Libération Memoire    
       delete mini;                            //
       delete mList;                        //
       delete msec;                            //
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 83
    Points : 55
    Points
    55
    Par défaut
    je pense que vous ne m'avez pas bien lu..
    ou alors je me suis mal exprimé ??

  5. #5
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Citation Envoyé par echap2000
    je pense que vous ne m'avez pas bien lu..
    ou alors je me suis mal exprimé ??
    Dans ce cas prècise ce que tu désir.
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 83
    Points : 55
    Points
    55
    Par défaut
    ok

    je vais expliquer très clairement

    imaginons un fichier qui a contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [Noms]
    nom=Kim
    nom=Louis
    nom=Albert
    Donc , le nom est la variable
    et ce qui suit le signe = est sa valeur

    lorsque je lis toute la section Noms:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ini->ReadSectionValues("Noms",ListBox->Items);
    ce composant listbox contient bien 3 lignes. jusque là , c'est normal
    cependant, comme la variable est chaque fois la même chose ,
    il me met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nom=Kim
    nom=Kim
    nom=Kim
    alors qu'il devait m'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nom=Kim
    nom=Louis
    nom=Albert
    faite le test, vous verrez bien

    sinon, ma question est, y -a-t-il une autre solution bien pratique pour contourner le problème (à part la solution que j'ai donnée à la fin de mon premier post)

    Merci

  7. #7
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Citation Envoyé par echap2000
    ok

    je vais expliquer très clairement

    imaginons un fichier qui a contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [Noms]
    nom=Kim
    nom=Louis
    nom=Albert
    Donc , le nom est la variable
    et ce qui suit le signe = est sa valeur

    lorsque je lis toute la section Noms:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ini->ReadSectionValues("Noms",ListBox->Items);
    ce composant listbox contient bien 3 lignes. jusque là , c'est normal
    cependant, comme la variable est chaque fois la même chose ,
    il me met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nom=Kim
    nom=Kim
    nom=Kim
    alors qu'il devait m'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nom=Kim
    nom=Louis
    nom=Albert
    faite le test, vous verrez bien

    sinon, ma question est, y -a-t-il une autre solution bien pratique pour contourner le problème (à part la solution que j'ai donnée à la fin de mon premier post)

    Merci
    Pourquoi ne pas mettre ton fichier .ini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     [Noms]
     nom1=Kim
     nom2=Louis
     nom3=Albert
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 83
    Points : 55
    Points
    55
    Par défaut
    tout simplement parce que je développe une application qui lit des fichiers externes : les fichiers txtsetup.oem . C'est un fichier qui est fournit avec un driver sata/raid. Souvent, on a le même nom de variable. Donc, on ne peut pas modifier .

    Et dans mon premier post, j'ai donné un morceau de ce fichier txtsetup.oem

  9. #9
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonsoir,
    j'ai très bien compris ta demande
    comme indiqué dans mon précédent post les fichiers de types inf ou oem sont de type Unicode
    le code que j'ai posté fonctionne parfaitement avec ce type de fichier contrairement au Objet CustomIni qui en cas de clé identique retourne toujour s la première occurence de la clé trouvle
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 83
    Points : 55
    Points
    55
    Par défaut
    Ok je vois
    il n'y a pas de solution simple dans TInifile..
    Il faudrait bricoler du code comme j'ai fais dans mon premier post , et toi aussi d'ailleur..

    c'est bon, j'ai eu ma réponse merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/05/2013, 16h13
  2. Réponses: 5
    Dernier message: 27/08/2009, 14h51
  3. Lire toutes les sections d'un fichier INI
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/10/2007, 09h09
  4. Réponses: 9
    Dernier message: 15/05/2007, 14h28
  5. fichier ini -> recuperer toute les sections
    Par abignon dans le forum MFC
    Réponses: 2
    Dernier message: 08/04/2004, 18h46

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