Utilisation de fichier binaire

Résolu/Fermé
gaetanse Messages postés 22 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 5 août 2020 - 10 janv. 2019 à 19:36
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 14 janv. 2019 à 10:06
Bonsoir , j'utilise un fichier binaire remplie d'int pour mon jeu,
le problème c'est que je ne c'est pas comment modifier se fichier binaire pour changer
variables a l'intérieur , comment je dois faire ?

exemple : 0 0 1 1 1 3 4 4 4 4
je veut remplacer 3 par qu'elle que chose.

(je ne peut pas re ecrire tous le fichier, car je fait du lazy loading ,
je charge dans mon tableau seulement , les valeurs dans l'écran 40*20,
du coup les autres ne seront pas pris en compte et ma map sera fausse)

Merci à vous.
A voir également:

1 réponse

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 11 janv. 2019 à 10:40
Salut gaetanse,

Après avoir ouvert ton fichier binaire (dans un mode permettant l'écriture dans ton cas), tu peux te déplacer dans un flux
fich
ouvert avec la fonction
fseek()
d'un certain nombre d'octets que tu indiques en 2ème paramètre (ce déplacement se fait par rapport au début du fichier, à la position courante ou à la fin du fichier en fonction de ce que tu mets en 3ème paramètre).

Vois :

http://www.cplusplus.com/reference/cstdio/fseek/

Comme ce sont des
int
dans ton cas, chaque
int
occupe plus d'un octet et, par exemple, pour changer l'entier
3
, qui serait en 6ème position à partir du début du fichier, tu te positionnerais avec un code du genre :
fseek(fich , sizeof int * (6 -1)), SEEK_SET);
(non testé) ...

Ensuite, tu écrirais à cet endroit un seul
int
, par exemple un
int i = 7;
avec un code du type :
fwrite(&i, sizeof int, 1, fich);
(non testé non plus) ...

http://www.cplusplus.com/reference/cstdio/fwrite/

Bien sûr, cela serait bien de tester les codes d'erreur éventuels, etc.

Dal
0
gaetanse Messages postés 22 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 5 août 2020
11 janv. 2019 à 14:58
oui mais si je fais sa , tu es sur que sa va écrasé la donnée dans le fichier ? car j'ai peur que sa rajoute juste une donnée en plus a cette position ? Merci à toi en tout cas de répondre.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
11 janv. 2019 à 15:38
Non, cela n'insère pas (cela serait bien si cela existait), cela écrase. Tout ce que tu risques, c'est d'écraser les mauvaises données en te trompant, donc travaille sur une copie si ce fichier a de la valeur, met du code de vérification du succès des fonctions utilisées,...
0
gaetanse Messages postés 22 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 5 août 2020
11 janv. 2019 à 21:34
sa marche pas du tout x)

je fais sa :

void gestion_map::sauvegarde(int nb,int variable){

FILE * fichier;
fichier = fopen(nom_map.c_str(),"wb");
fseek(fichier,nb*4,SEEK_SET);
fwrite(&variable, sizeof(int), 1, fichier);
fclose(fichier);

}


Mon fichier de map fait environ 4mo , et quand je fais sa il se retrouve a quelque ko,
donc sa doit surement recréer un fichier '-'

j'ai vérifier les positons sont correct , c'est peut être a cause du mode ouverture ? je ne sais pas
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > gaetanse Messages postés 22 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 5 août 2020
12 janv. 2019 à 12:10
les modes d'ouverture "w" vident le fichier au moment de l'ouvrir. je suggère d'essayer avec "r+".
0
gaetanse Messages postés 22 Date d'inscription samedi 3 novembre 2012 Statut Membre Dernière intervention 5 août 2020
12 janv. 2019 à 14:53
c'est-ce qu'il me fallait , super merci a toi :)
0