Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1726 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++ Builder] TFileStream & Struct

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++ Builder] TFileStream & Struct

n°911788
Inekman
Posté le 01-12-2004 à 00:56:26  profilanswer
 

Salut les amis,
 
Je m'initie lentement au C++ avec C++ Builder depuis quelques semaines. Depuis quelques jours, je bloque sur un petit problème que j'ai retourné dans 12 mille (mauvais ?) sens différents sans pour autant trouver une solution.
 
Voici succintement la chose :
 
J'ai un structure :
 

Code :
  1. struct Fichier
  2. {
  3.     String Nom[100];
  4.     String Comm[50];
  5.     int Taille;
  6. };


 
Une procédure qui créée un fichier à l'aide des données qui se trouvent dans la structure :
 

Code :
  1. void __fastcall TfrmMain::btMakeClick(TObject *Sender)
  2. {
  3.     aFichier = new Fichier;
  4.     *aFichier->Nom = edText->Text;
  5.     *aFichier->Comm = edComment->Text;
  6.    
  7.     TFileStream *exeData = new TFileStream(ExtractFilePath(Application->ExeName) + "test", fmCreate);
  8.     TMemoryStream* ms_file = new TMemoryStream;
  9.     // ensuite le fichier ajouté
  10.     ms_file->LoadFromFile(od1->FileName);
  11.    
  12.     // dans le fichier final
  13.     exeData->CopyFrom(ms_file, ms_file->Size);
  14.     aFichier->Taille = ms_file->Size;
  15.     exeData->Write(aFichier, sizeof(Fichier));
  16.     ms_file->Free();
  17.     exeData->Free();
  18.     Application->MessageBoxA("Fichier généré avec succès","yes",0);
  19. }


 
Et voici celle qui est sensée lire les données sensées être dans le fichier généré :
 

Code :
  1. void __fastcall TfrmMain::btLireClick(TObject *Sender)
  2. {
  3. if (od1->Execute())
  4.     {
  5.         aFichier = new Fichier;
  6.         TMemoryStream* ms_file = new TMemoryStream;
  7.         ms_file->LoadFromFile(od1->FileName);
  8.         ms_file->Seek(-sizeof(Fichier),soFromEnd);
  9.         ms_file->ReadBuffer(aFichier, sizeof(Fichier));
  10.         edText->Text = ExtractFileName(od1->FileName);
  11.         edComment->Text = *aFichier->Comm;
  12.         lblText->Caption = *aFichier->Nom;
  13.         lblSize->Caption = aFichier->Taille;
  14.         delete ms_file;
  15.     }
  16. }


 
Dans l'état actuel des choses, le fichier est généré avec des trucs (mais quoi ?) dedans. Cependant, je n'arrive pas à relire ce que j'ai écrit dans le fichier.
 
Je ne comprend rien en standard C++, c'est pas ce que je cherche à savoir pour le moment. Je fais essentiellement du Delphi et C++ Builder ne me déroute pas trop par rapport aux autres EDI, ce qui justifie mon choix.
 
Si quelqu'un connaissant un peu le fonctionnement des Stream pouvait me filer un coup de main, ça serait gentil de sa part. :hello:  
 
Merki.
 
ps : Je sais pas du tout si je suis à côté de la plaque avec mes bouts de code lamentablement écrit. [:airforceone]


Message édité par Inekman le 01-12-2004 à 14:23:26
mood
Publicité
Posté le 01-12-2004 à 00:56:26  profilanswer
 

n°914226
Inekman
Posté le 03-12-2004 à 19:16:58  profilanswer
 

Chui deg, c'est si facile en Delphi que je pensais que ça serait à peine plus dur en C++...je trouve pas :'(
 
A la rigueur, si vous avez une alternative à me proposer pour lire/écrire les données d'une structure dans fichier, je suis preneur :(


Message édité par Inekman le 03-12-2004 à 19:17:14
n°914227
cris56
Posté le 03-12-2004 à 19:25:40  profilanswer
 

c'est extremement dangereux de programmer à l'aveuglette, surtout en c++ (avec tout les mechanismes cachés)
 
en fait avant de passer à c++builder il aurais fallut que tu apprennes les bases (avec un bouquin comme support->bibliolinks), ce n'est pas une perte de temps car tu en sera infiniment plus efficace

n°914228
bjone
Insert booze to continue
Posté le 03-12-2004 à 19:32:35  profilanswer
 

déjà ça:
 
   1. struct Fichier
   2. {
   3.     String Nom[100];
   4.     String Comm[50];
   5.     int Taille;
   6. };
 
String Nom[100]
 
ça crée probablement (voir certainement) pas une chaine de 100 caractères, mais un tableau de 100 chaines.
 
en C++ Builder je ferais plustôt
 
   1. struct Fichier
   2. {
   3.     AnsiString Nom;
   4.     AnsiString Comm;
   5.     int Taille;
   6. };
 
ou avec std::string classique.
 
aussi, si tu donnais ce ton algorithme, et ce que tu veux enregistre/lire, parceque là on nage dans ton truc.

n°914290
Inekman
Posté le 03-12-2004 à 22:07:08  profilanswer
 

Ah, je tiens d'abord à vous remercier pour avoir apporté quelques éléments de réponses pour m'orienter.
 
Pour éclaircir le problème voici plus d'explications. Quand je me "lance" dans un langage que je ne maîtrise pas du tout, la première chose que je fais c'est afficher le texte contenu dans une zone de texte dans une boîte de message.  
A priori, c'est pas compliqué sauf que les chaînes de caractères en C++ me parraissent trop chelou. Je nage entre des Char, String, Ansistring et autre truc zarbe. Je compare souvent (à tort ?) à ce que je fais dans Delphi et je m'aperçois que c'est pas (pour l'instant) aussi simple.
 
Pour le truc que je souhaite faire là, c'est à dire pas grand chose, ça reste dans le pure cadre de l'apprentissage.  
 
Alors, sur la fiche se trouve 2 zones de texte (edNom, edComment) et une étiquette (lblSize).  
Lors d'un clique sur un premier bouton (btOpen), je choisi un fichier dans la fenêtre de sélection de fichier (OpenDialog). Lorsqu'on a choisi le fichier, edNom contient le nom du fichier et lblSize contient sa taille en octet. edComm contient deux ou trois mots de "commentaires".
 
Ensuite, un deuxième bouton btMake remplit une variable du type de la structure et essaye d'enregistrer les données de la structure dans un fichier, euh binaire si je raconte pas de bétise (en opposition à un fichier texte).
 
Et enfin, un clique sur un troisième bouton (btLire) affiche une fenêtre de sélection de fichier. Normalement, je choisi le fichier qui est sensé être créé précédement et je lis le contenu du fichier dans une variable du type de la structure puis j'affecte chaque information de la structure dans les zones de texte (edNom, edComment) et l'étiquette (lblSize) de ma fiche.
 
J'espère que c'est plus clair sachant que cette méthode fonctionne très bien avec Delphi c'est pourquoi je me suis lancé, un peu de manière hasardeuse, dans la conception de ce truc.  
 
Je cherche à faire le plus simple possible pour le moment, pas de considération pour le standard ni l'optimisation, c'est définitivement pas le but de mon exercice :-)
 
cris56 -> Je possède 3 livres sur le C++ : Visual C++6 (Eyrolles), La bible du programmeur (C/C++/C#) avec une très grande partie expliquant (bien ou mal je sais pas) les bases et enfin un autre bouquin tout piti pour les débutants :p. Je me procurerai le Stroustrup un peu plus tard.
 
bjone -> y'a t-il une grande différence entre AnsiString et std::string ? Dois-je penser que je confond char Nom[100] et String Nom[100] ?
 
Merci pour tout les gars, ça m'aide beaucoup ce genre de petite mise au point sympatique.

n°914298
bjone
Insert booze to continue
Posté le 03-12-2004 à 22:22:28  profilanswer
 

tu confonds plustôt char Nom[100] qui ne peut acceuillir que 100 (99) caractères et planter au-delà, et String / std::string / AnsiString Nom tout-court qui n'a pas de limites.
 
donc potasse les deux derniers bouquins (pas celui sur VC++ 6).
 
et fait des projets en mode console dans C++ Builder.

n°914312
cris56
Posté le 03-12-2004 à 22:40:05  profilanswer
 

inekman a écrit :


Pour éclaircir le problème voici plus d'explications. Quand je me "lance" dans un langage que je ne maîtrise pas du tout, la première chose que je fais c'est afficher le texte contenu dans une zone de texte dans une boîte de message.


 
peut etre en vb, mais pas en c++, le premier programme que tu fais c'est un hello world en mode console
 
apprends donc les bases du langage en faisant des petits programmes en mode console qui ne necessitent aucunes bibliothèques à par la lib standard

n°914325
cris56
Posté le 03-12-2004 à 22:45:04  profilanswer
 

inekman a écrit :

cris56 -> Je possède 3 livres sur le C++ : Visual C++6 (Eyrolles), La bible du programmeur (C/C++/C#) avec une très grande partie expliquant (bien ou mal je sais pas) les bases et enfin un autre bouquin tout piti pour les débutants :p. Je me procurerai le Stroustrup un peu plus tard.


 
je te conseil le stroustrup et te déconseil le visual c++6 qui ne t'apprendra pas les bases du langage et le compilo date du c++ pre standard (trop vieux)

n°914392
Inekman
Posté le 03-12-2004 à 23:46:01  profilanswer
 

d'ailleurs j'ai comparé le VC++6 et La Bible et bien le premier parle à 90% de MFC avec CMachin à tout bouts de champs alors que le second reste plutôt dans des notions moins partiales au niveau du logiciel utilisé.
 
Je lirai plus en détail les livres à propos des chaines mais par rapport à mon problème initial, pouvez-vous me dire comment je dois procéder pour enregistrer des données dans un fichier et pouvoir les lire par la suite ? A défaut de code, j'aimerai bien quelques api qui pourrait m'aider à faire ça, ou mieux, un lien qui me dirigerait vers la gestion d'entrées/sorties de flux de donées. Ca serait cool car mes recherches sur gogol à propos de TFileStream et Struc sont infructueuses :'(

n°914454
bjone
Insert booze to continue
Posté le 04-12-2004 à 01:24:15  profilanswer
 

avec C++ Builder tu as TIniFile je crois qui permet d'écrire des fichiers .ini, ça peut être un début pour toi.

mood
Publicité
Posté le 04-12-2004 à 01:24:15  profilanswer
 

n°914469
Inekman
Posté le 04-12-2004 à 01:43:05  profilanswer
 

oui je connais cette classe mais ça s'éloigne de mon objectif :-p
 
C'est dommage qu'il y ait autant de changement entre le Delphi et C++Builder :( Le concepte de ce que je veux faire est bien clair dans mon esprit mais ce sont les moyens qui me font défaut. Il me faut absolument rester dans le cadre du TFileStream et de la Structure :)

n°914472
bjone
Insert booze to continue
Posté le 04-12-2004 à 01:47:06  profilanswer
 

le C/C++ n'est pas clair dans ton esprit, donc travaille-le d'abord.

n°914474
Inekman
Posté le 04-12-2004 à 01:59:35  profilanswer
 

c'est vrai que je sais pas trop comment utiliser les char et les string mais je sais pas si ça va m'aider à comprendre pourquoi je n'arrive pas à enregistrer les données de la structure dans un fichier. A la rigeur, que je confonde certaine chose, soit, mais si tu as une solution dans l'immédiat à me proposer, je t'écoute car j'apprendrai au passage :p


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++ Builder] TFileStream & Struct

 

Sujets relatifs
Utilisation du TDBChart avec builder?[C++] Lié des variables a l'intérieur d'une struct à...
l'équivalent d'une struct en ada?J'ai du mal avec les struct et les pointeurs ensemble !
C++ Builder Socket Bloquant !Utilisation des composants Indy 9 sous C++ Builder
C++ builder formatage hex[C] Possible de faire un extern sur une union de struct [RESOLU] ?
c++ builder 6 pro et les fluxcreer un graphe en builder c++
Plus de sujets relatifs à : [C++ Builder] TFileStream & Struct


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR