| Ecriture dans un fichier binaire | |
|
|
Auteur | Message |
---|
Mumu
Nombre de messages : 176 Localisation : 45 Date d'inscription : 20/12/2012
| Sujet: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 12:20 | |
| Bonjour les Panoramicien(ne)s.
Je rencontre un petit problème. Je voudrais écrire des données dans un fichier binaire, mais à chaque fois que je l'ouvre en écriture, Poanoramic me l'écrase et m'en crée un nouveau, vide celui-là... Normal c'est ce que fait filebin_open_write d'après la doc. C'est une action que je peux faire avec les fichiers texte avec file_open_append, mais le mode append n'existe visiblement pas en binaire. Je sèche.. Quelqu'un aurait-il une idée ? Merci
| |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 13:12 | |
| Je ne me suis jamais penché sur le problème, mais je pense que la bonne méthode serait: 1/ Lire le fichier et charger son contenu actuel 2/ Modifier les données (modification ou ajout) 3/ Ecrire le fichier binaire Il doit y avoir d'autres solutions, mais c'est la plus simple et elle doit répondre à pas mal d'usages courant (en dehors des gros fichiers) dans un temps raisonnable. Sinon, tu peux aussi faire: - Code:
-
dim taille%
rem ouvrir un fichier binaire en lecture file_open_read 1,"test"
rem lire la taille du fichier taille% = filebin_size(1)
rem se positionner à la fin filebin_position 1,taille%
rem écrire ce que tu veux (40 dans notre exemple) filebin_write 1,40
rem fermer le fichier filebin_close 1 | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 13:47 | |
| La seule solution, comme dit Jicehel, c'est de lire entièrement le fichier dans un tableau avec Filebin_Block_Read, de travailler dans ce tableau, puis de réécrire entièrement le tableau dans un fichier (le même ou un autre). Ca peut mettre quelques secondes pour un très long fichier (> 1M) mais c'est supportable. - Code:
-
DIM v%(2000000): ' à dimension en fonction de la taille maxi des fichiers FILEBIN_OPEN_READ 1, f$ sz% = FILEBIN_SIZE(1) FILEBIN_BLOCK_READ 1,sz%,v%(0) FILEBIN_CLOSE 1 '... modification des données du tableau ... ' ... mise à jour de sz% si taille modifiée FILEBIN_OPEN_WRITE 1, f$ FILEBIN_BLOCK_WRITE 1,sz%,v%(0) FILEBIN_CLOSE 1 Je ne vois pas d'autre solution. (en FreeBasic on peut lire (et réécrire) entièrement un fichier, y compris binaire, dans une seule chaîne de caractères)Edit: je crois bien qu'on s'est croisés Jicehel... effectivement, pour le cas que tu traites, c'est à dire ajouter des données, ta solution est la plus évidente. Et c'est bien ce que semble vouloir faire Mumu, ajouter des données. | |
|
| |
Mumu
Nombre de messages : 176 Localisation : 45 Date d'inscription : 20/12/2012
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 15:04 | |
| Merci pour la rapidité de réponse. La copie du fichier dans un tableau d'entiers, j'y ai pensé mais je ne trouvais pas ça élégant... Encore que là on pourrait même envisager d’insérer des données au milieu du fichier. Moi têtu. Moi voulais travailler sur le fichier directement...! La 2ème solution que Jicehel propose présente un inconvénient de taille. le fichier "test" est ouvert en lecture. La réaction de Panoramic est épidermique et non moins compréhensible : file number not use for writing ! Bon.. ben pour le moment je vais travailler sur des tableaux. Merci encore et à bientôt | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 15:19 | |
| Excuses moi, je le fais de tête comme je ne peux pas programmer du boulot. Il faut fermer le fichier et le réouvrir en écriture, mais j'ai oublié de mettre les 2 lignes. Ca donne ça: - Code:
-
dim taille%
rem ouvrir un fichier binaire en lecture file_open_read 1,"test"
rem lire la taille du fichier taille% = filebin_size(1)
rem fermer le fichier filebin_close 1
rem ouvrir un fichier binaire en écriture file_open_write 1,"test"
rem se positionner à la fin filebin_position 1,taille%
rem écrire ce que tu veux (40 dans notre exemple) filebin_write 1,40
rem fermer le fichier filebin_close 1 | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 15:50 | |
| Je comprends ta réaction Mumu, ça me choque aussi de mettre tout un fichier dans un tableau (un élément de tableau par octet, ça fait un peu gaspillage), mais bon, si c'est assez rapide et qu'on a la mémoire disponible, au diable l'avarice ! J'aurais préféré la méthode freebasic, tout le fichier dans une chaîne (la lecture est instantanée), et après on fait ce qu'on veut avec la chaîne, puis on réécrit. Il y a aussi le Filebin_Hexa_Read, mais c'est un peu lourd à manipuler, et là la lecture est limitée à 2000 octets, alors autant oublier. | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 16:42 | |
| Sinon, il y a aussi le système par blocs (ça dépend de l'usage) | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 17:39 | |
| Par blocs, tu veux bien dire dans un tableau, comme dit ci-dessus ? (Filebin_Block_Read et Write) je ne vois rien d'autre...
Il faudrait pouvoir charger tout le fichier d'un seul coup dans une espèce de Dlist en binaire (une zone mémoire, un buffer en fait)... comme pour les fichiers texte, et bricoler après en mémoire avec un indice, avant réécriture. Ce serait bien moins lourd que dans un tableau. Et on pourrait accéder à des zones entières continues, pas comme avec un tableau. | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 18:13 | |
| Mon deuxième source ne fonctionne pas ? Je pense qu'il le devrait, j'avais juste oublié de noter la fermeture et la réouverture du fichier pour pouvoir écrire dedans, mais en toute logique, il devrait fonctionner dans la version corrigée. Sinon pour les Blocks, c'est ça, c'est le système du tableau de valeurs. Ca peut répondre à certains besoins. Je n'en connais pas assez sur l'usage attendu pour voir ce qui conviendrait le mieux. Après sinon, il y a la sauvegarde dans un fichier non binaire qui peut répondre à beaucoup d'autres besoins, même pour le stockage de valeurs binaires (codées ou non sous forme héxadécimales) Donc Mumu, si ça ne convient pas à ton usage dis nous en un peu plus sur ce que tu souhaites faire que l'on te propose une solution qui conviennent le mieux possible à ton usage souhaité. | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 18:35 | |
| Ben, ton 2ème source est bizarre. 1) tu récupères la taille du fichier (filebin_open... au lieu de file_open, mais c'est un détail) et tu fermes, ok 2) tu ouvres ce fichier 'test' en écriture, mais ceci va créer un nouveau fichier, vide (voir la doc) ! tu ne peux pas te positionner en 'taille%' dedans puisqu'il est vide, à mon avis ou tu auras une erreur, ou ta donnée '40' va s'écrire au début, et tu auras détruit ton fichier d'origine au moment de la fermeture. Il n'y a pas d'append possible dans ce cas.
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 19:14 | |
| Je suis en train de réaliser les fonctions dont tu as besoin. Quelques heures de patience... | |
|
| |
Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 20:43 | |
| Le fait qu'il n'est pas possible de modifier un fichier binaire est une lacune que je vais corriger. | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 20:46 | |
| Gloups, tu as raison JL35, je ne m'en rappelais plus... désolé... Donc en effet, forcément chargement puis réecriture ou utilisation de la DLL de Klaus en attendant que les fonctions soient ajoutées dans Panoramic nativement. On s'est croisé Jack. Si Jack le met dans ses priorités, ça fait que va être rapide | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 20:56 | |
| Ça Jack c'est une bonne nouvelle, j'ai souvent regretté ce manque dans Panoramic ( et d'être obligé à des acrobaties, ou de le faire sous-traiter par un autre langage). | |
|
| |
Mumu
Nombre de messages : 176 Localisation : 45 Date d'inscription : 20/12/2012
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 22:52 | |
| Houlà !!! Il n'entrait pas dans mes intentions de donner un coup de pied dans une fourmilière !! Merci à tous de manifester un tel intérêt pour mes petits soucis. Effectivement, un filebin_open_write détruit le fichier. Alors j'étais parti (et pas encore arrivé) dans des développement "abracadabrantesques"... Mais si une commande doit voir le jour, qui règle élégamment le problème, je saurai me montrer patient. Merci encore à tous | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 23:03 | |
| Comme quoi, tu vois qu'il ne faut pas hésiter à intervenir, ça va servir à tout le monde (toutes les fourmis) !
Tu peux toujours utiliser une solution de secours, en attendant, histoire de faire avancer ton schmilblick, quitte à la remplacer après, parce qu'on ne peut pas savoir quand ce sera fait, ça dépendra des disponibilités de Jack. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Ecriture dans un fichier binaire Lun 25 Fév 2013 - 23:45 | |
| J'ai mis ma solution en ligne. Voir ici pour plus d'informations. Et voici un programme de démo. Il peut fonctionner avec n'importe quel fichier, binaire ou texte. Il traite tout fichier comme s'il était binaire. - Code:
-
' demo_fichiers_binaires.bas
label lecture, creation, ajout
dim res%, buf$, nom$, i%
KGF_initialize("KGF.dll")
open_dialog 1 save_dialog 2
button 101 : top 101,10 : left 101,10 : caption 101,"Lecture" on_click 101,lecture button 102 : top 102,40 : left 102,10 : caption 102,"Création" on_click 102,creation button 103 : top 103,70 : left 103,10 : caption 103,"Ajout" on_click 103,ajout
memo 201 : top 201,10 : left 201,200 : width 201,300 : height 201,300
end
lecture: nom$ = file_name$(1) if nom$="_" then return ReadBinaryFileToString(nom$) clear 201 item_add 201,ReadBinaryFileToString$ return creation: nom$ = file_name$(2) if nom$="_" then return if file_exists(nom$)=1 message "Refusé." return end_if if count(201)=0 message "Vide." return end_if buf$ = "" for i%=1 to count(201) buf$ = buf$ + item_read$(201,i%) + chr$(13) + chr$(10) next i% WriteStringToBinaryFile(nom$,buf$) return ajout: nom$ = file_name$(1) if nom$="_" then return if count(201)=0 message "Vide." return end_if buf$ = "" for i%=1 to count(201) buf$ = buf$ + item_read$(201,i%) + chr$(13) + chr$(10) next i% AppendStringToBinaryFile(nom$,buf$) return
#INCLUDE "KGF_SUB.bas"
Pour tester: - utilisez d'abord le bouton "Lecture". Il lit un fichier binaire à choisir dans un dialogue d'ouverture, puis place son contenu dans un mémo. Evidemment, le résultat n'est lisible que si le fichier est un fichier texte. - puis, utilisez le bouton "Création". Il crée un fichier binaire à partir du contenu du mémo. - et finalement, modifiez le contenu du mémo et utilisez le bouton "Ajout". Sélectionnez le même fichier que celui créé à l'étape précédente, et le contenu du mémo sera ajouté à la fin du fichier choisi. Bien sûr, cela est clairement visible si les fichiers choisis sont des fichiers textes. Mais si ce sont des fichiers binaires, le programme les traite exactement de la même manière. EDIT J'ai ajouté une fonction de remplacement d'octets à l'intérieur d'un fichier binaire. Plus d'infos ici. En-dessous du mémo, il y a des zones concernant le remplacement. Le bouton "Remplacement" utilise ces information pour modifier un fichier choisi dans un dialogue d'ouverture. Attention: les modifications sont permanentes, et le choix d'un fichier par erreur peut détruire ce fichier ! | |
|
| |
Contenu sponsorisé
| Sujet: Re: Ecriture dans un fichier binaire | |
| |
|
| |
| Ecriture dans un fichier binaire | |
|