[C++ Builder] TFileStream & Struct

TFileStream & Struct [C++ Builder] - C++ - Programmation

Marsh Posté le 01-12-2004 à 00:56:26    

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
Reply

Marsh Posté le 01-12-2004 à 00:56:26   

Reply

Marsh Posté le 03-12-2004 à 19:16:58    

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
Reply

Marsh Posté le 03-12-2004 à 19:25:40    

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

Reply

Marsh Posté le 03-12-2004 à 19:32:35    

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.

Reply

Marsh Posté le 03-12-2004 à 22:07:08    

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.

Reply

Marsh Posté le 03-12-2004 à 22:22:28    

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.

Reply

Marsh Posté le 03-12-2004 à 22:40:05    

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

Reply

Marsh Posté le 03-12-2004 à 22:45:04    

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)

Reply

Marsh Posté le 03-12-2004 à 23:46:01    

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 :'(

Reply

Marsh Posté le 04-12-2004 à 01:24:15    

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

Reply

Marsh Posté le 04-12-2004 à 01:24:15   

Reply

Marsh Posté le 04-12-2004 à 01:43:05    

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 :)

Reply

Marsh Posté le 04-12-2004 à 01:47:06    

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

Reply

Marsh Posté le 04-12-2004 à 01:59:35    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed