Vb6, supprimer un élément dans un fichier .dat

Résolu
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 - 17 nov. 2007 à 23:40
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 :)

7 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
18 nov. 2007 à 09:47
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 #   
3
Profil bloqué
18 nov. 2007 à 03:42
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
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
18 nov. 2007 à 03:54
Et je n'ai pas bien compris pourquoi tu ne peux pas ouvrir 2 fichiers en même temps ???

MPi²
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
18 nov. 2007 à 04:02
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
18 nov. 2007 à 13:22
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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
18 nov. 2007 à 13:27
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'
0
mstarsup5 Messages postés 527 Date d'inscription lundi 15 octobre 2007 Statut Membre Dernière intervention 10 octobre 2013 1
18 nov. 2007 à 14:27
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 :)
0
Rejoignez-nous