Vb6, supprimer un élément dans un fichier .dat [Résolu]

Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
- - Dernière réponse : mstarsup5
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
- 18 nov. 2007 à 14:27
Bonjour,

C'est encore un problème avec les fichier binaires (.dat ici), j'aimerais savoir s'il existe une commande pour effacer un élément du fichier.

Pour ce fichier, j'écris quelque chose à l'intérieur sous forme de types, en répétant le procédé (le fichier ressemble donc à DonnéesPseudo1 DonnéesPseudo2 DonnéesPseudo3,.....
cependant, j'aimerais savoir s'il existe une commande pour supprimer une de ces données dans le fichier.
(avoir à la fin par exemple: DonnéesPseudo1 DonnéesPseudo3,....) (le DonneesPseudo2 à été effacé)

J'ai essayé en copiant les données à k+1 pour les mettre en k, mais il n'y a rien pour fermer le fichier après, il reste toujours un résidu...

Une autre solution serait de copier les données que je veux garder dans un autre fichier, pour ensuite effacer le premier fichier, puis copier le second à sa place, ce qui est fastidieux, et qui surtout pose problème car vb6 me dit que je ne peux pas ouvrir les 2 fichiers en même temps...

Je pourrais toujours arriver à me débrouiller en faisant une boucle, ouvrant un fichier, mettant les données dans une variable temporaire, fermer le fichier, ouvrir le second, copier, fermer, réouvrir le premier, etc.... mais bon.... question propreté, j'ai déjà vu mieux ;-)

Enfin bref, si quelqu'un connait une commande pour effacer un élément dans un fichier écrit en binaire, merci beaucoup :)

Toute aide est la bienvenue!
Merci beaucoup :)
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
28
3
Merci
Ce n'est pas un problème de syntaxe, mais d'organisation du code

Freefile te donne le premier n° de fichier libre. mais si tu fait :
fic= freefile
fic2=freefile
open filename for binary as #fic
open filename2 for binary as #fic2
forcément que ça ne va pas marcher puisque fic et fic2 auront le même n°. Par contre :
fic=freefile

open filename for binary as #fic

fic2=freefile
open filename2 for binary as #fic2

doit marcher puisque fic a été ouvert avant le second Freefile, son n° n'est donc plus libre et donc le second Freefile te donneras le prochain n° libre, mais cette fois ci différent de fic.

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #   

Dire « Merci » 3

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

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

Commenter la réponse de cs_casy
Messages postés
1270
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
24 juillet 2013
6
0
Merci
bonjour
A ma connaissance il n'existe pas de commande pour effacer directement dans un fichier binaire un élément quelconque.Il faut charger les différents éléments dans un tableau , effacer le fichier et recréer un nouveau fichier avec les éléments que l'on veut garder
Les différents éléments dépendent évidemment de la structure du fichier binaire : cela peut-être des valeurs numériques de différents types (integer,double,etc...) ou des valeurs chaines de caractères
Sans plus de précision on ne peut guère t'en dire plus

GRENIER Alain
Commenter la réponse de cs_Galain
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
15
0
Merci
Et je n'ai pas bien compris pourquoi tu ne peux pas ouvrir 2 fichiers en même temps ???

MPi²
Commenter la réponse de cs_MPi
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
0
Merci
Salut,

Je viens de faire une boucle pour effacer l'élément du fichier, "méthode bourrin", puisqu'il n'y a pas (ou ej ne connais tout simplement pas) la commande adéquate :)

Pour MPi, j'avais un problème pour ouvrir deux fichiers, problème de syntaxe sûrement: il n'acceptait pas que je lui dise fic=freefile, fic2=freefile, open filename for binary as #fic, open filename2 for binary as #fic2, ...
Ca me faisait un blocage à open filename2 for binary as #fic2, je pense à cause d'un problème de syntaxe, j'ai essayé de donner des valeurs différentes à fic et fic2 sans succès...
Problème de syntaxe quoi :)
Sinon, à part ça, si je stocke tout quelque part, que je vire le fichier, et que je restocke tout, ça marche :)
Commenter la réponse de mstarsup5
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
57
0
Merci
Salut
Toujours sur tes fiches ?
Un fichier, qu'il soit texte ou dat, ne permet pas de supprimer de données en plein milieu.
Deux solutions :

- Vider le contenu de la fiche, c'est à dire mettre des espaces ou quelque chose qui dise que cette fiche est vide, afin qu'à la relecture tu ne la prennes pas pour une fiche valide.
Plus tard, quand tu auras besoin d'insérer une nouvelle fiche, il faudra penser à scruter tout le fichier pour rechercher une éventuelle fiche 'vidée' et la réutiliser, plutôt que d'ajouter ta nouvelle fiche à la suite.

- Restructurer ton fichier :
Ouvrir le fichier dat (A) en lecture = option "Access Read" dans le Open
Ouvrir un nouveau fichier (B) en écriture = option "Access Write" dans le Open
Relire chaque fiche du fichier A : Si la fiche est Ok, l'écrire dans le fichier B, sinon, passer à la suivante
Refermer les deux fichiers
Détruire le fichier A
Renommer le fichier B en fichier A

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Commenter la réponse de cs_Jack
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
57
0
Merci
PS : Si, tu peux ouvrir plusieurs fichiers en même temps.
Il faut prendre la précaution de :
- Bien refermer les fichiers précédemment ouverts
- Toujours utiliser FreeFile pour déterminer le n° du prochain fichier à ouvrir

De mémoire, un même fichier ne peut pas être ouvert plusieurs fois, sauf si :
- Il est ouvert en méthode 'Binary' ou 'Random'
- Il est ouvert avec l'option 'Access Read'
Commenter la réponse de cs_Jack
Messages postés
527
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
10 octobre 2013
0
Merci
Oui Jack, c'est ce que j'avais, sauf que ça faisait tout moche parce que je n'arrivais pas à ouvrir les deux fichiers en même temps: je copie les bonnes données dans un second fichier, j'efface le premier et renomme le second.
J'avais essayé de faire open filename for binary as #1, open filename2 for binary as #2, mais ça ne marchait pas, ça me sortait une erreur...
Mais ce qu'a écrit casy marche:
fic=freefile
open filename for binary as #fic
fic2=freefile
open filename2 for binary as #fic2

Donc je viens de remplacer ça dans mon code pour que ça ressemble moins à du n'importe quoi (ouvrir, fermer les fichiers 2 fois dans chaque récurrence de la boucle, c'est franchement dégueulasse...)

En bref, ça donne ça:

longueur = Len(FichePseudoTemp)
Ecart = 0
fic=freefile
Open Filename For Binary As #fic
fic2 = FreeFile
Open Filename2 For Binary As #fic2
Put #fic2, 1, sTemp2 '(le pseudo utilisé en ce moment)
Seek #fic, 1 + Len(sTemp)
Seek #fic2, 1 + Len(sTemp)
For i = 1 + Len(sTemp) To LOF(fic) Step longueur
    Get #fic, i, FichePseudoTemp
    If FichePseudoTemp.Nick = sTemp Then '(le pseudo à effacer)
        Ecart = longueur
    Else
        Put #fic2, i - Ecart, FichePseudoTemp '(le Ecart c'est pour décaler une fois qu'on a passé les données à supprimer, pour éviter d'avoir un trou)
    End If
Next
Close #fic
Close #fic2
Kill Filename
Name Filename2 As Filename '(fonction que je ne connaissais pas et que j'avais trouvé en cherchant 2 secondes sur le net :)

Bien sur, j'ai rajouté une sécurité si on vire le pseudo qui est entrain de jouer, mais je ne l'ai pas marqué ici... :)

Pour jack et MPi, je voulais juste rajouter cette fonction en plus, pour éviter que si quelqu'un se plante en écivant un pseudo, il doive se retrouver avec le choix soit d'effacer le fichier contenant toutes les données de pseudo, soit de revoir ce pseudo erroné à chaque fois qu'il veut changer de login.

et le problème était de savoir donc s'il y avait une commande pour ça, ou quelque chose pour lire les 2 fichiers en même temps (je ne comprends toujours pas pourquoi mon
open filename for binary as #1
open filename for binary as #2
ne marchait pas... J'avais compris, comme l'a souligné casy que ce que j'avais écrit avant était mauvais, mais je pensais qu'en mettant ça, ça marcherait justement :/

Enfin bon, sur ce, merci à tous pour l'aide que vous m'avez apporté, et puis à une prochiane :)
Commenter la réponse de mstarsup5