Passer d'un String à un dynamic Array et inversement [Résolu]

Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
- - Dernière réponse : cs_christophedlr
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
- 27 juin 2008 à 17:15
Bonsoir,

J'ai remarqué que pour qu'une donnée s'écrive correctement dans un fichier avec BlockWrite, il fallait un array of  char (par exemple).

Mais j'ai un soucis, je veux sauvegarder le contenu d'un TRichEdit dans un fichier binaire suivant la structure que j'ai décidé pour ce format, il me faut donc passer du String vers un Array of Char.

Comment faire cela ?

Merci d'avance.

P.S.: Ne connaissant pas à l'avance la taille pour le array of char, je le définit en dynamic, donc il apparait comme un dynamic of char.
Afficher la suite 

20/44 réponses

Meilleure réponse
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
3
Merci
"Avec les Stream, c'est sur qu'il y aura pas le soucis d'enregistrement
rencontré avec blockWrite qui oblige a passer par des Array of ?"

pffffffff ...

procedure TForm1.Button3Click(Sender: TObject);
Var F : File; N : Integer;
begin
  AssignFile(f, 'f:\test.dat');
  try
    Rewrite(f,1);
    BlockWrite(f, PChar(RichEdit1.Lines.Text)^, Length(RichEdit1.Lines.Text), n); 
  finally
    Closefile(f);
  end;
end;

quand je te dit : "c'est comme ce que tu utilises mais en beaucoup mieux"

teste avant de revenir à la charge

Mais il est préférable d'utiliser les Streams
 
@+
Cirec

<hr siz="" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 204 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
Bonsoir,

et si tui écrivais simplement :

RichEdit1.Lines.SaveToFile('c:\monfichier.rtf'')
RichEdit1.Lines.LoadFromFile('c:\monfichier.rtf'')


non ?

cantador
Commenter la réponse de cs_cantador
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
C'est bien pour sauvegarder dans un fichier texte, mais pas dans un binaire.
Commenter la réponse de cs_christophedlr
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
9
0
Merci
L'objectif est bien de conserver le fomat.
il fallait bien donner la solution la + simple..
autre piste :
stocker tes données dans un champ BLOB d'une table.

cantador
Commenter la réponse de cs_cantador
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
Salut,

comme ça peut être:

procedure TForm1.Button1Click(Sender: TObject);
var fs: TFileStream;
begin
  fs := TFileStream.Create('Mon_fichier.bin',  fmCreate);
  try
    fs.WriteBuffer(PChar(RichEdit1.Lines.Text)^, Length(RichEdit1.Lines.Text));
  finally
    fs.free;
  end;
end;

 
@+
Cirec

<hr siz ="" />
Commenter la réponse de Cirec
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
Ouais mais là tu utilises les Streams hors j'ai jamais réussi à m'en servir.
Commenter la réponse de cs_christophedlr
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
ou encore,

procedure TForm1.Button2Click(Sender: TObject);
var fs: TFileStream;
begin
  fs := TFileStream.Create('Mon_fichier.bin',  fmOpenReadWrite);
  try
    fs.Seek(0, soFromEnd);
    RichEdit1.Lines.SaveToStream(fs);
  finally
    fs.free;
  end;
end;

ce code ouvre le fichier 'Mon_fichier.bin' et ajoute le contenu du RichEdit1 à la fin du fichier.

voiolà avec tout ça tu devrais y arriver
 
@+
Cirec

<hr siz ="" />
Commenter la réponse de Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
32
0
Merci
ben c'est simple et en plus tu as deux démos

la première crée un le fichier (si il existe déjà il est écrasé)
et la deuxième ouvre le fichier pour lire et ajouter des données c'est simple

c'est comme ce que tu utilises mais en beaucoup mieux

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
Avec les Stream, c'est sur qu'il y aura pas le soucis d'enregistrement rencontré avec blockWrite qui oblige a passer par des Array of ?
Commenter la réponse de cs_christophedlr
Messages postés
1649
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
7
0
Merci
salut,
pour compléter ce que te dit cirec un petit rappel sur les Tstrings et en particulier les RichEdit.
 Les TStrings range les données dans un string qui n'est autre qu'un tableau dynamique ( c'est la propriété text) puis il crée une liste de pointeurs en utilisant les séparateurs (#13) mais sans modifier la propriété text
ce n'est qu'à l'affichage qu'il le redécompose en lines
Ainsi en utilisant un SaveToFile ou les méthode de cirec tu obtiendras trés exactement la même chose que tu le nommes 'monfichier.txt' ou 'monfichier.bin' le programme se 'fout' comme sa première couche du nom de l'extension qui n'est après tout qu'une convention et même si tu l'appelais 'tarte a la creme.ttc' son contenu serait identique

l'anvantage d'utiliser un savetofile est surtout pratique puisque c'est lui qui gère  les procédure d'ouverture et de fermeture de fichier

Jlen
Commenter la réponse de jlen100
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
[auteur/JLEN100/304728.aspx jlen100],
Tu as pas compris ce qu'est le SaveToFile, cela permet de sauvegarder dans un fichier texte, donc lisible par le commun des mortels.
A ne pas confondre avec ma demande qui est pour sauvegarder dans un fichier binaire donc non lisible par un mortel (a moins d'en connaitre la structure précise et encore c'est pas très simple avec un éditeur héxa).

Cirec,
Je vais tester avec ça et je te dirais.
Commenter la réponse de cs_christophedlr
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
Cirec,
Je viens de tester ta solution avec le PChar et le pointeur, et ça fonctionne.
Merci à toi.
Commenter la réponse de cs_christophedlr
Messages postés
1649
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
7
0
Merci
[auteur/CHRISTOPHEDLR/213015.aspx christophedlr] avant de faire une affirmation tu ferais bien mieux de lire l'aide delphi et tu aurais vu que le SaveToFile n'est réservé aux seuls fichier ".text" je te la site:
"Syntaxe Delphi :

procedure SaveToFile(const FileName: string); virtual;

Syntaxe C++ :

virtual void __fastcall SaveToFile(const AnsiString FileName);

Description

La méthode SaveToFile enregistre les chaînes de la liste dans le fichier spécifié par FileName. Chaque chaîne de la liste est écrite sur une ligne distincte de texte.

Dans Linux, SaveToFile enregistre les chaînes telles qu'elles apparaissent dans la liste. Si la dernière chaîne ne dispose pas d'un marqueur de fin de ligne, le fichier résultant peut être considéré comme incomplet par certains éditeurs. "
d'une façon plus générale:

"Toutes les images et tous les graphiques de Delphi peuvent charger leurs images à partir d'un fichier et les stocker en retour dans ce même fichier (ou dans un autre). Ceci peut s'effectuer à tout moment.

Remarque

Vous pouvez aussi charger des images à partir d'un fichier et les enregistrer dans une source MIME Qt ou un objet flux en cas de création de composants multiplates-formes.

Pour charger une image dans un objet image à partir d'un fichier, appelez la méthode LoadFromFile de l'objet image. Pour enregistrer une image dans un fichier à partir d'un objet image, appelez la méthode SaveToFile de l'objet image.

LoadFromFile et SaveToFile acceptent le nom d'un fichier comme seul paramètre. LoadFromFile utilise l'extension du fichier pour déterminer le type d'objet graphique créé ou chargé. SaveToFile utilise le type de fichier approprié au type d'objet graphique enregistré."

Jlen
Commenter la réponse de jlen100
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
Tu as encore rien compris mon pauvre Jlen100, tu te contente de citer la doc sans connaitre la différence entre un fichier dit binaire et un fichier dit texte.

Un fichier binaire, tu ne peux pas le lire avec LoadFromFile ou avec des fonctions comme ReadLn utilisé de paire avec AssignFile et toute la clique.

Un fichier binaire, pour l'utiliser on utilise des Streams ou BlockRead/BlockWrite.
Pourquoi cela ?
Parce que la structure ne se résume pas à écrire bêtement du texte comme fait SaveToFile, la structure est spéciale.
Elle peut contenir aussi bien une valeur binaire, héxadécimal, nombre et chaine (en gros).
SaveToFile, prend le contenu du TRichEdit (dans notre cas), et le copie dans un fichier tous simplement.
Le résultat est un fichier dit texte.

Mon cas est un fichier dit binaire, où dedans je stocke une chaine définissant la signature afin de reconnaitre le format, un CRC32, le dit contenu du TRichEdit et enfin une marque de fin de fichier.

Avec un simple TRichEdit.SaveToFile et TRichEdit.LoadFromFile ou avec des fonctions comme ReadLn/WriteLn, lire une telle structure.
Celle-ci étant composé la plupart du temps, par une taille fixe de données, il faut passer par les Streams (si on peut choisir de lire que x octets) ou un BlockRead/BlockWrite permettant la lecture de x octets comme requis par la structure du format.

D'ailleur, petite citation de wikipedia sur les fichiers texte :
En informatique, un fichier texte ou fichier texte brut ou fichier texte simple ou (le plus souvent abusivement) fichier ASCII, est un fichier dont le contenu représente uniquement une suite de caractères informatiques. Il faut noter qu'en informatique, l'espace et le retour à la ligne sont considérés comme des caractères au même titre qu'une lettre, un chiffre ou un signe de ponctuation.

Un fichier « non texte » est appelé « fichier binaire », dans le sens où les bits contenus dans le fichier ne peuvent pas être représentés par une simple suite de caractères.

Autres exemple, un fichier .EXE (exécutable Microsoft), est un fichier dit binaire.

Si tu essai de le lire avec Notepad, tu pourras pas, hors un fichier texte oui.
Commenter la réponse de cs_christophedlr
Messages postés
1649
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
7
0
Merci
c'est surtout que tu ne connais pas le fonctionnement de delphi et des filestreams!!
et encore moins la structure des fichiers!!
sujet clos qua   nd on est un âne baté on le reste!!
Commenter la réponse de jlen100
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
Petit malin va !

Si tu stockes le contenu du RichEdit dans un fichier, sans modifier l'encodage des caractère et sans méthode de chiffrement, ton fichier texte sera LISIBLE dans n'importe quel lecteur de fichier texte.

Bien sûr, tu peux rajouter un en-tête, un CRC à la fin qui eux ne seront pas lisibles dans notepad (tu verras des caractères bizarres) mais tout le reste le sera.

Du reste, j'ai compris ce que tu veux faire, et c'est bien sûr possible avec les streams, par exemple :

<hr size= "2" width="100%" /> procedure TMyForm.WriteMyFile;
const
  CHeader = 'HeaderOfMyNewFileFormatV0.25';
var
  Size, CRC: Integer;
  S: TFileStream;
  M: TMemoryStream;
begin
  S := TFileStream.Create('blablabla.bin', fmCreate);
  M := TMemoryStream.Create;
  try
    S.WriteBuffer(CHeader, SizeOf(CHeader)); // Ecrit l'entête
    RichEdit.SaveToStream(M);                // Sauvegarde le RichEdit dans un flux temporaire
    Size : = M.Size;                          // Retient la taille du flux...
    S.WriteBuffer(Size, SizeOf(Integer));    // ... et l'écrit dans le fichier
    S.CopyFrom(M, 0);                        // Ecrit aussi le flux M dans le fichier
    CRC := MakeMyCRC(M);                     // Calcule le CRC (à toi de faire cette procédure)
    S.WriteBuffer(CRC, SizeOf(Integer));     // Ecrit le CRC dans le fichier
  finally
    M.Free;
    S.Free;
  end;
end;
<hr size ="2" width="100%" />
Et le partie "texte" du fichier (càd le contenu du RichEdit) sera LISIBLE dans notepad.

Voila tout

A+
Flo

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Commenter la réponse de florenth
0
Merci
Christophe : Tu as rien compris et malheureusement tu as dis un tissu d'anerie.
Rien que ca "Si tu essai de le (sous entendu fichier binaire) lire avec Notepad, tu pourras pas, hors un fichier texte oui." est a mourir de rire, car bien evidemment on peut ouvrir un fichier binaire avec NotePad.

Je rejoins JLen tu connais rien à la structure d'un fichier car ton executable tu vas le flinger en le modifiant.

Pour finir : Tu es effectivement tétu comme un ane batté. Cirec se tue à te dire que les blocs c'est des trucs de bourrin, et plutot que d'utiliser un truc élégant et efficace que sont les streams, tu restes dans ton truc de bourrin. T'es ridicule.

Pour ce qui concerne le SaveToFile : JLen a raison.
Commenter la réponse de Utilisateur anonyme
0
Merci
Bon moi je reprend mon ticket de grève : c'était pour la bonne cause
Commenter la réponse de Utilisateur anonyme
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
0
Merci
De Wikipédia :


<hr size= "2" width="100%" />DEF = Un fichier « non texte » est appelé « fichier binaire », dans le sens où les bits contenus dans le fichier ne peuvent pas être représentés par une simple suite de caractères.
<hr size ="2" width= "100%" />
On refait la phrase:
DEF = Dans un fichier binaire, les bits (ou octets d'ailleurs) ne peuvent pas être représentés par une simple suite de caractères.

Ce n'est pas la même chose que :
DEF =/= Dans un fichier binaire, les bits (ou octets d'ailleurs) ne peuvent pas être représentés par une suite de caractères.
ce qui aurait le même sens que :
DEF =/= Dans un fichier binaire, les bits (ou octets d'ailleurs) ne peuvent pas être représentés par une suite
de caractères.

Si tu ne comprends pas ça, je n'y peux rien. Attention à la logique, c'est quand même une des bases essentielles de la programmation.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
Commenter la réponse de florenth
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
4
0
Merci
Et bien puisque d'après vous je suis con, alors tous les professionnels sont des cons, a moins que se soit vous.
C'est vous qui y connaissaient rien du tous sur les fichiers.

Un fichier texte, tous est lisible, je dis bien TOUS ce qui se trouve dans le fichier, ce qui est pas le cas d'un fichier binaire.
Bien sur que Notepad va pouvoir lire un fichier binaire, mais vas-tu pouvoir lire TOUTE les informations présentes ?
Non, bien sur que non vu que c'est binaire.

Maintenant si vous me croyez pas, aller demander à un vrai professionnel.
Pour information mon frangin est développeur, il a un BAC+5, je pense donc pas qu'il soit aussi con que vous le prétendez, vu que apparemment ce qu'il m'a appris c'est du n'importe quoi.

Un fichier texte, rien n'est caché, c'est pas le cas d'un binaire où des informations apparaissent pas en clair.
Maintenant puisque vous ne voulez pas le croire, libre à vous, moi au moins je sais que je dis vrais.

Sur ce, j'ai déjà dit que avec ce que Cirec m'a indiqué fonctionne, donc je vois même pas pourquoi vous me faite chier avec vos messages disant que je dis n'importe quoi, surtout que vous semblez dire qu'un fichier binaire et texte c'est pareil, alors je me demande pourquoi des logiciels comme SmartSVN par exemple arrivent à distinguer un fichier binaire d'un fichier texte vu que c'est pareil enfin d'après vous.

Florenth, ta dernière phrase et je cite :
Dans un fichier binaire, les bits (ou octets d'ailleurs) ne peuvent pas être représentés par une suite
de caractères. qui correspond avec d'autres termes à la phrase de Wikipedia : Un fichier « non texte » est appelé « [c.aspx?u=aHR0cDovL2ZyLndpa2lwZWRpYS5vcmcvd2lraS9GaWNoaWVyX2JpbmFpcmU= fichier binaire] contenus dans le fichier ne peuvent pas être représentés par une simple suite de caractères.
Est explicite.

Une suite de caractère ASCII donc lisible par n'importe quel humain sans programme du type éditeur héxa (en utilisant notepad par exemple), rend le fichier texte, si maintenant des informations apparaissent en "codé", exemple des fichiers .EXE, alors c'est un binaire.

N'importe qui qui est capable de comprendre, aurait compris cela, manifestement je suis le seul ici.
De toute façon, vous ne cessez de me dire : "Fait un SaveToFile", je vous que cela est impossible, alors puisque pour vous c'est possible pour créer un fichier binaire, montrer moi que j'ai tord en me montrant un code complet utilisant cela et le résultat donné par un éditeur héxadécimal.
Si on ne voit que des informations compréhensibles, c'est que c'est un fichier texte, si maitnenant nous avons par exemple des suites du genre : #.D}<
Cela montre bien des informations incompréhesible, donc cela cache une donnée caché qui doit être lu directement en héxa, par exemple c'est le cas d'un CRC, pour ceux qui auraient par hasard regarder comment est constituer un fichier ZIP, vous aurez remarquer que le CRC n'est pas lisible en clair dans le fichier, c'est une suite de caractère bizarre comme je viens d'en donner l'exemple, et qui représente une certaine suite héxadécimal.
Cette suite en question EST le CRC en question.

Maintenant, si les admins veulent me bannir, me punnir, libre à eux, cela montrera que Codes-Sources.com n'est plus ce qu'il était et que Nix cautionne le droit de punir une personne qui à raison et qui se fait engeuler par des abrutis sans connaissance.
Commenter la réponse de cs_christophedlr