cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 2023
-
25 juin 2008 à 22:16
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 2023
-
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.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 25 juin 2008 à 23:23
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 26 juin 2008 à 08:31
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
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20234 26 juin 2008 à 08:37
[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).
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 26 juin 2008 à 10:23
[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 :
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é."
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20234 26 juin 2008 à 11:02
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.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 26 juin 2008 à 11:23
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!!
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 26 juin 2008 à 11:30
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.
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.
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 26 juin 2008 à 11:36
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.
cs_christophedlr
Messages postés267Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention23 août 20234 26 juin 2008 à 14:06
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.