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

mstarsup5 527 Messages postés lundi 15 octobre 2007Date d'inscription 10 octobre 2013 Dernière intervention - 17 nov. 2007 à 23:40 - Dernière réponse : mstarsup5 527 Messages postés lundi 15 octobre 2007Date d'inscription 10 octobre 2013 Dernière intervention
- 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
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 18 nov. 2007 à 09:47
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 #   

Merci cs_casy 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_casy
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 18 nov. 2007 à 03:42
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
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 18 nov. 2007 à 03:54
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
mstarsup5 527 Messages postés lundi 15 octobre 2007Date d'inscription 10 octobre 2013 Dernière intervention - 18 nov. 2007 à 04:02
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 18 nov. 2007 à 13:22
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 18 nov. 2007 à 13:27
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
mstarsup5 527 Messages postés lundi 15 octobre 2007Date d'inscription 10 octobre 2013 Dernière intervention - 18 nov. 2007 à 14:27
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.