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 :

Ecrire dans un fichier


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut Ecrire dans un fichier
    Bonjour à Tous,

    J'essaye d'écrire des données dans un fichier "Categorie.txt".
    Voici le code de mon programme :
    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
    void __fastcall TDefinitionCategorie::PoussinOKClick(TObject *Sender)
    {
    void __fastcall TDefinitionCategorie::PoussinOKClick(TObject *Sender)
    {
      char buffer[500];
     
     // CREATION FICHIERS DE SAUVEGARDE
      struct CATEGORIE {
                       AnsiString NaisPou1[4];
                       AnsiString NaisPou2[4];
                       AnsiString NaisBen1[4];
                       AnsiString NaisBen2[4];
                       AnsiString NaisMin1[4];
                       AnsiString NaisMin2[4];
                       AnsiString NaisSen1[4];
                       AnsiString NaisSen2[4];
                     }TabCat[8];
     
      HANDLE hCat;
      hCat = CreateFile ("Categorie.txt",
                            GENERIC_READ | GENERIC_WRITE,
                            FILE_SHARE_READ,
                            NULL,
                            CREATE_ALWAYS,
                            FILE_ATTRIBUTE_READONLY,
                            NULL);
     
      if(hCat != INVALID_HANDLE_VALUE)
       {
          //Nombre de caracteres écrits dans le buffer
          DWORD nBW;
     
         for(int i=0;i<sizeof TabCat / sizeof TabCat[0];i++)
              WriteFile(hCat,&TabCat[i], sizeof TabCat[i],nBW, NULL);
         CloseHandle(hCat);
     
         //Focus au champ Naissance POUSSIN 2
         NaisPous2->SetFocus();
       }
       else
       {
         FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                       NULL,GetLastError(),
                       MAKELANGID(LANG_FRENCH, SUBLANG_FRENCH),
                       buffer, 500, NULL);
       }
     
      //Focus au champ NAISSANCE BENJAMIN : NaisBen1
      NaisBen1->SetFocus();
    }}
    Mais, cela génére des erreurs du style :
    [C++ Erreur] Categorie_Combattant.cpp(83): E2034 Impossible de convertir 'unsigned long' en 'unsigned long *'
    [C++ Erreur] Categorie_Combattant.cpp(83): E2342 Mauvaise correspondance de type dans le paramètre 'lpNumberOfBytesWritten' ('unsigned long *' désiré, 'unsigned long' obtenu)
    Je ne comprends pas le message E2034. Pourquoi faut-il faire cette conversion?
    Je ne comprends égelement pas le message E2342...
    Pourriez-vous m'aider???
    Merci d'avance...

  2. #2
    Membre averti
    Avatar de Altau
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    296
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 296
    Points : 360
    Points
    360
    Par défaut
    1. J'espère que tu n'as pas dans ton véritable code 2 fois la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall TDefinitionCategorie::PoussinOKClick(TObject *Sender)
    comme montré dans ton message.

    2. Je ne sais pas où est la ligne 83 mais le message signifie que tu passes à ta fonction un paramètre unsigned long alors qu'elle un attend un pointeur sur un unsigned long.

    3. Tu crées ton fichier avec l'attribut FILE_ATTRIBUTE_READONLY ce qui t'empêcherait d'écrire dedans au cas où ça compilerait avec succès.
    RAD Studio 10.3 / Ubuntu 20.04 - RYZEN 7 2700X - 24Go de RAM

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour Altau,

    1° Erreur de ma part, lors de la copie de mon code dans la fenêtre d'explication.
    2° Par contre, je vais regarder de plus près le paramètrage de la fonction WriteFile...
    3° Je vais modifier les droits d'accès au fichier.
    pour tes conseils... au revoir...

  4. #4
    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
    dans ton code tu a fait une structure avec des AnsiString
    struct CATEGORIE {
    AnsiString NaisPou1[4];
    AnsiString NaisPou2[4];
    AnsiString NaisBen1[4];
    AnsiString NaisBen2[4];
    AnsiString NaisMin1[4];
    AnsiString NaisMin2[4];
    AnsiString NaisSen1[4];
    AnsiString NaisSen2[4];
    }TabCat[8];
    AnsiString est une classe Borland pour la gestion des châines de caractères
    la taille d'une classe est égale à la taille d'un pointeur cad 4

    tu ne peux par conséquent utiliser de sizeof pour connaitre la taille de ta structure mais pour chaque élément AnsiString de ta structure la fonction Length() qui re donne la taille exact de ta chaine.

    dans ton cas il est préférable d'utiliser des tableaux de caractères

    concernant ton erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WriteFile(hCat,&TabCat[i], sizeof TabCat[i],nBW, NULL);
    nBW doit être un pointeur sur un unsigned long tu dois donc prefixer cette variable avec un '&'

    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

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour les amis,

    Malgré vos conseils, je suis pas arrivé à utliser la fonction WriteFile.
    Cependant, j'ai modifié mon code avec des fonctions en C.
    Voici le code :
    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       int handle1;
       int handle2;
       char string1[4];
       char string2[4];
      //Récuperation de Edit1->Text dans cp1
       char* cp1 = Edit1->Text.c_str();
       strcpy(string1, cp1);
        _fmode = O_BINARY;
       //Creation du fichier en mode binaire en ecriture et lecture
       handle1 = creat("c:\\NaisPous1.txt", S_IREAD |S_IWRITE);
       // Ecriture de 4 caracteres dans le fichier
       write(handle1, string1, strlen(string1));
       //Fermeture Fichier
       close(handle1);
     
      //Récuperation de Edit2->Text dans cp1
       char* cp2 = Edit2->Text.c_str();   
       strcpy(string2, cp2);
       _fmode = O_BINARY;
       //Creation du fichier en mode binaire en ecriture et lecture   
       handle2 = creat("c:\\NaisPous2.txt", S_IREAD |S_IWRITE);
      // Ecriture de 4 caracteres dans le fichier
       write(handle2, string2, strlen(string2));
       //Fermeture Fichier
       close(handle2);
    }
    Cela fonctionne très bien.
    Mais pouvez-vous me mettre sur la voie pour la réalisation d'une structure du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       struct Poussin
        {
        char NaisPou1[4];
        char NaisPou2[4];
        };
    Edit1->Text et Edit2->text seront écrit respectivement dans NaisPou1 et NaisPou2 de cette structure selon le principe décrit plus haut. En espérant, que cela reste compatible...
    d'avance pour votre aide...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 63
    Points : 61
    Points
    61
    Par défaut
    Bonjour à Tous,

    La persévérance a porté ces fruits...
    Voici le code que j'utilise pour mon problème d'écriture dans un fichier (utlisation d'une structure)
    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
    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
     int iFileHandle;
     
     struct Poussin
            {
                    char Pous1[4];
                    char Pous2[4];
            }Nais;
     
     StrCopy (Nais.Pous1,MaskEdit1->Text.c_str());
     StrCopy (Nais.Pous2,MaskEdit2->Text.c_str());
     
     iFileHandle = FileCreate("C:\\Poussin.txt");
     
     FileWrite(iFileHandle,Nais.Pous1, sizeof(Nais.Pous1));
     FileWrite(iFileHandle,Nais.Pous2, sizeof(Nais.Pous2));
     
     FileClose(iFileHandle);
    }
    Ce n'est peut-être pas le mieux, mais cela fonctionne...

    à Tous pour vos conseils...

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

Discussions similaires

  1. Ecrire \" dans un fichier
    Par photorelief dans le forum Langage
    Réponses: 2
    Dernier message: 14/09/2005, 15h56
  2. [JAR] Lire et Ecrire dans un fichier contenu dans un jar
    Par lipao17 dans le forum Général Java
    Réponses: 5
    Dernier message: 02/05/2005, 12h01
  3. Ecrire dans un fichier
    Par gibet_b dans le forum Linux
    Réponses: 5
    Dernier message: 25/04/2005, 20h11
  4. Ecrire dans un fichier grace à un trigger ?
    Par zigoo dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/10/2004, 20h03
  5. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44

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