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 :

[C++.NET 2.0] Comment manipuler les fichiers INI ?


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 53
    Points : 50
    Points
    50
    Par défaut [C++.NET 2.0] Comment manipuler les fichiers INI ?
    tout le monde !

    Je suis en train de réaliser mon premier programme en C++.NET 2.0 sous Visual Studio 2005 Express...

    J'ai un gros problème avec l'utilisation des fichiers :
    J'ai créé une classe qui va me permettre de manipuler des fichiers INI (passés en paramètres).
    Je veux pouvoir lire ligne par ligne, pour trouver sections & clé.

    J'ai des notions de C (fopen, fseek, fwrite, fread), mais je n'arrive pas à les adapter à C++.NET 2.0...

    Pourriez vous m'aider ?
    * Comment lire un fichier ligne / ligne ?
    * Comment rajouter une ligne dans un fichier ?
    * Comment modifier une ligne ?

    Merci beaucoup par avance

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Comme il s'agit ici d'une particularité (les Fichiers INI), déjà sous 1.x il suffisait d'utiliser les API kernel32 dont notamment GetPrivateProfileString et WritePrivateProfileString
    Je suppose que c'est toujours valable sous 2.0, il y a ici un exemple de wrapper en C# qui ne te sera pas très compliqué à convertir en C++/CLI
    >> http://www.codeproject.com/csharp/cs_ini.asp

  3. #3
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut
    Salut ouam81,

    Tu peux aussi t'appuyer sur une classe nommée IniReader, que tu pourras trouver sur le lien suivant: http://www.mentalis.org/soft/class.qpx?id=6

    Il n'y a plus qu' a utiliser ces méthodes qui sont toutes basées sur les API, donc pas besoin pour toi de les redévelopper

  4. #4
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par joefou
    Salut ouam81,

    Tu peux aussi t'appuyer sur une classe nommée IniReader, que tu pourras trouver sur le lien suivant: http://www.mentalis.org/soft/class.qpx?id=6

    Il n'y a plus qu' a utiliser ces méthodes qui sont toutes basées sur les API, donc pas besoin pour toi de les redévelopper
    ... sauf que c'est en C# et VB...

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Comme tu fais du .NET, pkoi tu n'utilises pas les fichiers de configuration (app.config, qui sont les remplacants des ini) ?

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par ouam81
    ... sauf que c'est en C# et VB...
    Je t'ai mis le lien de la FAQ C++/CLI dans ton autre post en cas de besoin pour l'implémentation d'un Import de dll non managée.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 53
    Points : 50
    Points
    50
    Par défaut
    Merci pour toutes vos réponses !

    J'ai avancé ! mais je bloque plus loin ... décidément, je vais vous embetter longtemps !

    J'ai donc ma classe suivante qui fonctionne bien (pour la fonction EcrireCle) :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    using namespace System;
    using namespace System::Runtime::InteropServices;
    using namespace System::IO;
    using namespace System::Text;
     
    public ref class FichierINI
    {
     
    private:
        System::String ^ filename;
        [DllImport("kernel32")]
        static long WritePrivateProfileString(
             System::String ^ section,
             System::String ^ key,
             System::String ^ val,
             System::String ^ filePath);
     
        [DllImport("kernel32")]
         static int GetPrivateProfileString(
             System::String ^ section,
             System::String ^ key,
             System::String ^ def,
             System::String ^ retVal,
             int size,
             System::String ^ filePath);
     
    public:
        FichierINI(System::String ^ fichier);
        ~FichierINI(void);
        void EcrireCle(System::String ^ section, System::String ^ cle,
     System::String ^ valeur);
        System::String ^ LireCle(System::String ^ section,
     System::String ^ cle);
    };
     
    // Constructeur
    FichierINI::FichierINI(System::String ^ fichier)
    {
        this->filename = fichier;
        if(!File::Exists(fichier))
        {
            FichierINI::EcrireCle("MYSQL","serveur","");
            FichierINI::EcrireCle("MYSQL","port","");
            FichierINI::EcrireCle("MYSQL","bd","");
            FichierINI::EcrireCle("MYSQL","user","");
            FichierINI::EcrireCle("MYSQL","password","");
            FichierINI::EcrireCle("LDAP","serveur","");
            FichierINI::EcrireCle("LDAP","port","");
            FichierINI::EcrireCle("LDAP","baseDN","");
            FichierINI::EcrireCle("LDAP","user","");
            FichierINI::EcrireCle("LDAP","password","");
        }
    }
     
    FichierINI::~FichierINI(void)
     { /* RIEN A FAIRE DANS LE DESTRUCTEUR */ }
     
    void FichierINI::EcrireCle(System::String ^ section,System::String ^ cle,
     System::String ^ valeur)
    {
        WritePrivateProfileString(section,cle,valeur,this->filename);
    }
     
    System::String ^ FichierINI::LireCle(System::String ^ section,
     System::String ^ cle)
    {
        System::String ^ temp;
     
        int i = GetPrivateProfileString(section,cle,"",temp,255, this->filename);
     
        return temp->ToString;
    }
    J'arrive à écrire dans le fichier ini (création fichier etc nikel) mais lorsque je veux lire, je tombe sur l'erreur suivante :
    Une exception non gérée du type 'System.AccessViolationException' s'est produite dans top-parc.exe

    Informations supplémentaires : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
    .
    J'imagine que c'est parce que les DLL ne sont pas managée, et que c'est plus précisément la variable temp de la fonction GetPrivateProfileString qui fait ça... non ?

    En tout cas, je n'arrive pas à corriger cette erreur !

  8. #8
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    tu peux très facilement résoudre celà en utilisant un StringBuilder à la place d'un String pour retVal

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Effectivement,
    retVal nécessite un pointeur vers un buffer, soit vers une chaine que tu va modifier, or en code managé, le type String est type dit IMMUABLE. Ainsi la zone mémoire d'une instance de type string n'est plus modifiable lorsqu'il est initialisé. Si tu fait une affectation, la zone mémoire change et son contenu égallement, ce sont donc des zones mémoire PROTEGEES EN ECRITURE, d'où ta violation d'accès en mémoire !
    Le type StringBuilder, lui est plus proche du type string que tu as l'habitude de manipuler en C++ natif. car il s'agit d'un buffer ni plus ni moins, la zoné memoire associée est donc accessible en écriture aussi bien qu'en lecture.

    Lorsque tu fait un wrapper C# ou C++/CLI avec des dll natives, regarde bien à quoi sert l'argument et s'il doit etre ou non modifié par la fonction. S'il est suceptible d'etre modifié et que c'est une chaine, opte pour StringBuilder, sinon String fait très bien l'affaire. Ca t'évitera ce genre d'erreurs incongrues très pénibles

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/01/2015, 09h09
  2. Réponses: 5
    Dernier message: 19/05/2010, 12h47
  3. Réponses: 1
    Dernier message: 21/08/2006, 15h24
  4. Réponses: 23
    Dernier message: 23/05/2006, 16h52
  5. Réponses: 8
    Dernier message: 18/07/2005, 14h04

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