• 06 Juin 2026, 20:40:08


Auteur Sujet: Fwrite  (Lu 2158 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Fwrite
« le: 10 Mai 2009, 17:17:17 »
Salut tout le monde, je me creer un systeme de véhicule et puis j' ai un petit probleme =D


donc des qu' on achete un vehicule ca nous met une variable sur l id du vehicule et cette variable s enregistre dans le fichier du joueur donc la tout va bien
puis je creer un fichier vehicule.ini qui dedans contient l' id des vehicule suivie de l acheteur.
 et des qu une personne achete un vehicule je veut que ca change la ligne du vehicule par exemple

le vehicule 2 appartient a personne dans le fichier il y a ca.

2=personne
et apres achat ca ne modifie pas mais ca le met a la fin du fichier donc ....
voici le code qui doit normalement changer le fichier

VehiculeOwns[playerid] = GetPlayerVehicleID(playerid);
new nom[MAX_PLAYER_NAME];
GetPlayerName(playerid,nom,sizeof(nom));
SendClientMessage(playerid,COULEUR_YELLOW,"Vous avez acheter votre véhicule");
new File:File = fopen("vehicule.ini", io_append);
format(string,sizeof(string), "%d=%s\r\n",VehiculeOwns[playerid],nom);
fwrite(File, string);
fclose(File);

Merci



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne rivoal29

  • *
  • Bandit
  • Messages: 269
    • Voir le profil
Re : Fwrite
« Réponse #1 le: 13 Mai 2009, 17:07:48 »
Donc si j'ai bien comprit tu veux que sa mette a la suite dans ce fameux fichier vehicule.ini ?

Exemple:
(id=nom de la personne)
1=Rivoal
2=Machin
3=Truc
6=CHose
4=Happy
...
..
.


Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Fwrite
« Réponse #2 le: 13 Mai 2009, 17:08:47 »
Oui
et j ai aussi un autre pb je n arrive pas a recuperer le nom des autres sauf celle du 1



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Fwrite
« Réponse #3 le: 13 Mai 2009, 17:46:47 »
Salut,

normalement, pour trouver si un joueur possède un véhicule, tu devras faire une loop jusqu'à la fin du fichier (ou jusqu'à le trouver)

donc, tu fais 1 lecture par ligne, si tu utilise une variable, par exemple I, elle aura la même valeur que le ID du véhicule, te permettant ainsi de la savoir asser rapidement...

par contre, si un joueur achète un véhicule, tu devras te rendre à cette ligne (y a t'il une technique plus efficace que plusieurs fread?) afin d'y vérifier si un joueur l'a déjà acheté, puis ça se complique.... tu comprendra que tu ne peut simplement modifier la ligne en question via fread ou fwrite

tu dois donc utiliser les deux, lire le fichier et enregistrer les données d'une façon ou d'une autre puis tu le réécrit complètement (c'est d'ailleur ce que fais dini avec un nouveau fichier *.part)

++Sim++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Fwrite
« Réponse #4 le: 14 Mai 2009, 17:38:48 »
Le mieux, quand on veut pouvoir accéder rapidement à une donnée se trouvant dans un fichier, c'est de savoir à l'avance où elle se trouve.
Je m'explique.
Si on prend le fichier le fichier donné par rivoal29, on peut voir 2 choses :
1 - Les id sont dans le désordre.
2 - Les lignes n'ont pas toutes la même taille.

Ceci pose les problèmes suivants :
1 - Si je veux trouver le véhicule 6, il faut pratiquement que je lise le fichier en entier.
De plus, lorsque les id vont dépasser 10, ils seront écrits sur 2 chiffres (3 quand on dépassera 100). Ce qui oblige à faire un traitement de chaîne (certes simple) pour trouver le signe = et extraire les 2 parties de la chaînes.
2 - Si je veux remplacer un propriétaire par un autre, je devrais ré-écrire le fichier dans sa totalité car le nom du nouveau propriétaire ne fera certainement pas la même longueur que le nom de l'ancien (soit j'écrase des caractères dans la suite du fichier, soit certains caractères du nom de l'ancien propriétaire vont rester dans le fichier).

Étant donné qu'on est sur des machines qui disposent de beaucoup de mémoire et de beaucoup de place disque, il ne faut pas se priver de les utiliser.

La solution à ce genre de problème est de passé par un fichier formaté, c'est à dire avec un taille de ligne fixe.
En utilisant la solution qu'a donné Sim (la ligne X du fichier correspond au véhicule X).
Mon fichier ressemblera à ça si mes lignes font toutes 20 caractères :
Syg.................
sazuke78200.........
....................
....................
rivoal29............
....................

On voit ici que les véhicules 3, 4 et 6 ne sont pas attribués
NB : Les points ne sont pas des vrais caractères, ce sont en fait des 0 binaires.

Avec un fichier comme celui-ci, il est très facile d'aller lire directement le propriétaire du véhicule 5 :
new NomProprio[128];
new File=fopen ("MonFichier.Ini", io_read);
fseek (File, (5-1)*20); // On se décale dans le fichier
fread (File, NomProprietaire, 20); //On lit la ligne qui nous intéresse
fclose (File);

Idem pour remplacer un propriétaire (pour le véhicule 3 par exemple) :
new NomProprio[128];
for (new i=0 ; i<128 ; i++) nomProprio[i] = 0; // Pour être sûr d'avoir que des 0 binaires dans la chaîne
// Ici, il faut copier le nom du nouveau propriétaire dans NomProprio
new File=fopen ("MonFichier.Ini", io_write);
fseek (File, (3-1)*20); // On se décale dans le fichier
fblockwrite (File, NomProprietaire, 20); //On remplace avec la nouvelle ligne
fclose (File);

NB : Dans mes exemples, le nom du propriétaire ne doit pas dépasser 20 caractères.

Bien évidement, le fichier doit être pré-rempli avec des 0 en fonctions du nombres de véhicules qu'on doit gérer.
Il est aussi important de vérifier que fseek à bien effectué le déplacement dans le fichier (en testant le code retour).

Voilà, j'ai juste donné les bases mais ça devrait vous permettre d'aller de l'avant.
Il est aussi possible de mettre plusieurs données sur une même ligne, chaque donnée ayant la même taille d'une ligne sur l'autre (sur une même ligne, les données peuvent avoir des tailles différentes)
Exemple d'un fichier qui contient le pseudo d'un joueur, son niveau, son score et la couleur de ses chausettes (fonction SetPlayerSocksColor)
Syg.................5001294586227
sazuke78200.........0100058462512
....................0000000000000
....................0000000000000
rivoal29............0170015472553
....................0000000000000

Le nom est sur 20 caractère, le level sur 3, le score sur 10 et la couleur sur 2.

Le must reste encore de passer par une base de donnée (MySQL ou SQLite). D'ailleurs les principes énoncé ici sont utilisé par les serveurs de bases de données (de façon optimisée bien sur).

++
Syg

Courtesy of GtaManiac

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Fwrite
« Réponse #5 le: 14 Mai 2009, 17:41:10 »
Merci beaucoup Syg

t' es le  :king du Pawn



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Fwrite
« Réponse #6 le: 14 Mai 2009, 18:35:46 »
Salut,

merci Syg, je viens de comprendre comment se déplacer rapidement dans un fichier  :P


j'ignorais totalement comment utiliser la fonction fseek

VIVA EL KING :cheers :king :cheers : Syg

++SIM++





Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Fwrite
« Réponse #7 le: 17 Mai 2009, 13:01:53 »
Bon t' as solution fonctionne. Mais je n' arrive pas a sauter une ligne

donc j ai 3 vehicule

586,1279.705810,-1794.007080,12.910190,266.169158,1,1,-1
586,1270.285278,-1804.305053,12.917618,137.309036,1,1,-1
586,1257.288330,-1818.396240,12.926440,137.316589,1,1,-1

voici ce que contient le fichier Vehicule.ini

chaque ligne vaut 57 caractere
et je veut sauter une ligne a chaque ligne mais je n arrive pas a le faire regarder mon code

for(new bi = 0;bi <= 700; bi++)
{
new NomProprio[512],Veh[8][32];
new File:File = fopen ("Vehicule.ini", io_read);
new str[8];
format(str,8,"");
fseek(File,(bi)*57);
fread (File, NomProprio, 512); //On lit la ligne qui nous intéresse
split(NomProprio,Veh, ',');
if(!(strval(Veh[0]) == strval(str)))
{
printf("%s,%s,%s,%s,%s,%s,%s,%s",Veh[0],Veh[1],Veh[2],Veh[3],Veh[4],Veh[5],Veh[6],Veh[7]);
CreateVehicle(strval(Veh[0]),floatstr(Veh[1]),floatstr(Veh[2]),floatstr(Veh[3]),floatstr(Veh[4]),strval(Veh[5]),strval(Veh[6]),strval(Veh[7]));
}
else
  {
printf("%s,%s,%s,%s,%s,%s,%s,%s",Veh[0],Veh[1],Veh[2],Veh[3],Veh[4],Veh[5],Veh[6],Veh[7]);
  bi = 700;
  }
fclose(File);
}
Je n' y arrive plus j ai mal au yeux ca fait 1 heure que je cherche xD

bon j' ai trouver mais cela fonctionne qu' avec les ligne de 57 caractere il serait possible de le faire avec des ligne de diferrente taille ??

sinon voici mon code resolu:
new ligne = 0;
for(new bi = 0;bi <= 700; bi++)
{
new NomProprio[512],Veh[8][32];
new File:File = fopen ("Vehicule.ini", io_read);
new str[8];
format(str,8,"");
fseek(File,bi:(ligne));
ligne += 58;

fread (File, NomProprio, 512); //On lit la ligne qui nous intéresse
split(NomProprio,Veh, ',');
if(!(strval(Veh[0]) == strval(str)))
{
printf("%s,%s,%s,%s,%s,%s,%s,%s",Veh[0],Veh[1],Veh[2],Veh[3],Veh[4],Veh[5],Veh[6],Veh[7]);
CreateVehicle(strval(Veh[0]),floatstr(Veh[1]),floatstr(Veh[2]),floatstr(Veh[3]),floatstr(Veh[4]),strval(Veh[5]),strval(Veh[6]),strval(Veh[7]));
}
else
  {
printf("%s,%s,%s,%s,%s,%s,%s,%s",Veh[0],Veh[1],Veh[2],Veh[3],Veh[4],Veh[5],Veh[6],Veh[7]);
  bi = 700;
  }
fclose(File);
}
« Modifié: 17 Mai 2009, 14:47:22 par sasuke78200 »



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Fwrite
« Réponse #8 le: 18 Mai 2009, 14:46:19 »
Tu n'as pas besoin d'appeler la fonction fseek si tu lis toutes les lignes du fichier et que tu n'as aucune ligne vide.
La fonction fseek sert à se déplacer directement à un endroit du fichier.
Dans les exemples que je donne, le fichier est ordonnée selon une valeur (les ID de véhicules par exemple). Si ce n'est pas le cas chez toi, tu ne pourras pas utiliser la fonction fseek.
L'usage de la fonction fseek OBLIGE à ce que toutes les lignes (même celles qui sont vides) aient la même longueur.

Pour créer un ligne vide, il suffirai d'écrire une suite de 0 binaires (voir mon exemple). Manque de pot, la fonction fread est ennuyeuse car elle ne va pas lire la totalité des ces 0 binaires. Ce qui fait qu'il faudra 57 fread pour lire la totalité d'un ligne vide et passé à la ligne suivante (dans le cas où on n'utilise pas fseek).
Le mieux c'est de remplacer ces 0 binaires par des caractères lisibles. On peut prendre le point par exemple
Lorsque tu lis une ligne, si le premier caractère est un point, c'est que la ligne est vide.

Par contre, attention, il n'y a pas de caractère de retour à la ligne dans un fichier formaté, il est donc important de ne pas demander la lecture de plus de caractères qu'une ligne n'en comporte (57 dans ton cas) sinon on risque de lire plusieurs lignes à la fois (voire, le fichier en entier).

Le plus dur pour toi va être de créer un fichier contenant 700 (nombre de véhicule max) lignes "vides" de 57 caractères.
Voici un bout de script simple qui peux le faire :
new Buffer[58]; // 58 = 57+1 pour le caractère de fin de chaîne
new File:File = fopen ("Vehicule.ini", io_write);

/* Remplissage du buffer */
for new i=0 ; i<57 ; i++) Buffer[i] = '.';
for (new i=0 ; i<700 ; i++)
{
   fblockwrite (File, Buffer, 57);
}
fclose (File);

Si l'on ouvre ce fichier avec un éditeur, il n'affichera qu'une seule ligne car il n'y a aucun caractère de retour chariot ou saut de ligne.
Il est donc déconseiller de l'ouvrir (et de le sauvegarder) avec un tel éditeur qui risque d'en ajouter (des caractères) et de "cassé" le formatage du fichier.

++
Syg
Courtesy of GtaManiac

Hors ligne Ssk

  • *
  • Lulu's Stunt - Le serveur stunt de Lulu !
  • Messages: 8154
    • Voir le profil
Re : Fwrite
« Réponse #9 le: 18 Mai 2009, 18:02:29 »
Mais comment reussir a lire le fichier ligne par ligne ??

car deja je n arrive meme pas a lire le fichier avec un fread



Derrière tout programme se cache un programmeur, je considère le monde comme un programme.
Mon blog