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 :

Stockage de données & lecture d'un fichier texte


Sujet :

C++Builder

  1. #1
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 005
    Points
    2 005
    Par défaut Stockage de données & lecture d'un fichier texte
    Bonjour,

    cela fait 1 semaine que j'essaie de faire ca sans resultat...
    je recupère par liaison usb des octets (quantité de 0 à 524288)
    je les stoque dans un tableau de caractère declaré en variable pulique comme ceci :
    ensuite je souhaite enregistrer ces donnees et quelles prennent le moins de place possible sur disque
    pour cela je fabrique un fichier texte avec chacun de mes octets comme code de caractère, à la suite, sans espace ni mise en forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       FILE *fichier;
       unsigned long int k;
       fichier = fopen( "le premier fichier créé.txt", "w+");
       for (k = 0 ; k < NombreOctetAEcrire ; k=k+1)
            {
            fprintf(fichier, "%c", Donnees[k] );
            }
       fclose(fichier);
    cela me donne un fichier texte illisible mais cela correspond à ce que je souhaite puisque j'obtiens un fichier de 300ko par exemple si j'ai recupéré 300ko de données par l'USB

    C'est là que ca se gatte...

    Je souhaite ensuite récupérer ces données "archives" et créer un autre fichier texte, ordonné après traitement des données ;
    En d'autre termes, je veux récupérer mes octets !

    pour cela j'ai essayé de charger le contenu du fichier texte dans un AnsiString comme le montre la faq :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AnsiString Chaine;
    TStringList *List = new TStringList;
    List->LoadFromFile("le premier fichier créé.txt");
    Chaine = List->Text;
    delete List;
     
    unsigned long int longueur = Chaine.Length(); //on recupère la longueur de la chaine
    //on verifie...
    lb_FichierArchiveOuvert->Caption = longueur ;
    ce code fonctionne avec les fichiers textes "lisibles" mais :
    la longueur de l'ansistring Chaine est égale à zero quand j'ouvre "le premier fichier créé.txt" (le fichier archive que j'ai créé avec le code ci_enhaut) !
    par exemple, si je fabrique avec le blocnote un fichier texte avec 0123456789 ecrit dedans, j'obtient une Chaine de longueur 12...normal...
    Cette meme chaine fait une longueur nulle si j'execute le code sur un fichier texte de 510ko créé avec le code ci-enhaut.

    : A quoi cela est il du ?
    : Comment puis-je charger un tableau de char avec mes octets rangés dans le fichier texte ?
    : Peut etre qu'il ne faut pas faire comme ca pour stoquer des octets dans un fichier...???

    merci mille fois d'avance
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Février 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Je ne sais pas si cela va régler ton problème mais vu que tu enregistres des octets, ca ne serait pas mieux de les mettre justement ds un fichier binaire au lieu d'un ficher texte.

    Du moins ça me parait plus logique.

    A voir!!

  3. #3
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Évitez d'écrire

    Créez plutôt une constante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int Longueur=524290;
    et utilisez la (on évite d'écrire des valeurs "en dur")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Donnees[Longueur];
    Sinon, pour créer un fichier, utilisez simplement TMemoryStream, c'est immédiat et plus C++ Builder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TMemoryStream *MS;
    MS=new TMemoryStream();
    MS->Write(Donnees,Longueur);
    MS->SaveToFile("DATA.TXT");
    delete MS;
    Maintenant pour retrouver vos octets, utilisez LoadFromFile. Sur TMemoryStream, voyez mes Remarques, alinéa 71.

    À bientôt
    Gilles

  4. #4
    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
    Le problème est peut-être effectivement que vous traitez ce fichier comme un fichier texte. Il suffit que le premier octet reçu soit '\0' pour que ce fichier TEXTE ait la longueur 0, alors qu'il fait bien 524290 octets.
    "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

  5. #5
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 005
    Points
    2 005
    Par défaut
    Merci merci merci...

    Ca marche enfin avec ce 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
    unsigned long int i;
    TMemoryStream *MS;
    unsigned long int Taille;
    char *Tableau;
    MS=new TMemoryStream();
    MS->LoadFromFile("ESSAI3.TXT");
    Taille=MS->Size;         //on récupère la taille du stream
    Tableau=new char[Taille];     // on instancie une zone égale à la taille du stream
     
    MS->Read(Tableau,Taille);    //on lit (remplit Tableau) tous les octets de la zone du stream délimitée par Taille
    for(i=0 ; i < Taille ; i++) Donnees[i] = Tableau[i] ;
     
    delete MS;     //on libère le flux
    delete[] Tableau; //on libere le Tableau de "Taille" cases
    Maintenant, je vais essayer de passer aussi par un TMemoryStream pour la création du premier fichier "archive" afin d'eviter la boucle de fprintf. Je suppose qu'il est beaucoup moins lourd de passer par un TMemoryStream puisque si je comprends bien, fprintf accede au fichier texte sur le disque à chaque fois.

    par contre je ne comprend pas ce que vous me conseillez pour la déclaration de mon tableau de caractère.
    Comment faut il faire pour déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int Longueur=524290;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char Donnees[Longueur];
    alors que je suis en déclaration de variable publique ?
    Le compilateur ne veut pas que j'initialise des variables ici...

    ...merci
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

  6. #6
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Le mieux est de déclarer vos variables dans la classe principale, ce qui vous permet d'y accéder directement partout. Il vaut mieux déclarer un pointeur de caractères char* et de créer le tableau par new. Déclarez votre constante dans unit1.h et le pointeur dans la classe principale.

    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
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    const int Longueur=524290; // constante ICI
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
       TButton *Button1;
       void __fastcall Button1Click(TObject *Sender);
       void __fastcall FormDestroy(TObject *Sender);
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
       __fastcall TForm1(TComponent* Owner);
    char *Donnees; // le pointeur ICI
    };
    Vous créez le tableau dans la constructeur de la classe principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
    {
    Donnees=new char[Longueur];
    }
    N'oubliez pas de le détruire quand vous sortez du programme donc à l'événement OnDestroy de la forme principale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    delete[] Donnees;
    }
    Pour le reste, ce sera la même chose.

    À bientôt
    Gilles

  7. #7
    Membre chevronné Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    1 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 935
    Points : 2 005
    Points
    2 005
    Par défaut
    merci beaucoup
    Il y a 10 sortes de personnes dans le monde : ceux qui comprennent le binaire et les autres

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 02/08/2008, 18h41
  2. Lecture d'un fichier texte dans un projet TOMCAT
    Par brice_nice dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/07/2005, 15h04
  3. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  4. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  5. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58

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