Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?
Connexion avec identifiant, mot de passe et durée de la session

 
avancée

254730 Messages dans 14037 Fils de discussion- par 6623 Membres - Dernier membre: Magicien

24 Mai 2012 à 15:26:54
GTAOnline.frSan Andreas MultiplayerScripting SA-MP [Pawn center]Tutoriels et références SA:MP (Modérateurs: S!m, Xartrick)Les fonctions de gestion des fichiers
Pages: 1 2 [3]   Bas de page
Imprimer
Auteur Fil de discussion: Les fonctions de gestion des fichiers  (Lu 3786 fois)
0 Membres et 2 Invités sur ce fil de discussion.
S!m
Hors ligne Hors ligne


Moderateur
GTAOnline Fan Boy
*

Messages: 2260


« Répondre #30 le: 12 Février 2010 à 14:01:56 »

Salut,

c'est exactement ça, et il ne faut pas oublié de le fermer quand on en a plus besoin

++Sim++
Journalisée





vincentdu90
Hors ligne Hors ligne


GTAOnline Big Member
*

Lua , Php/MySQL & Html/Css

Messages: 507


« Répondre #31 le: 12 Février 2010 à 17:41:41 »

Une dernière question car après je vais polluer le tuto , j'aurai aimé savoir a quoi correspond le 5 entre crochets de la variable Tableau .



Exemple :

Code:
new File:Fic;
new Tableau[5];
Fic = fopen ("TOTO.BIN", io_readwrite);
if (Fic != File:0)
{
/* Lecture de 3 éléments */
fblockread (Fic, Tableau, 3));
fclose (Fic);
}
else
{
printf ("Erreur d'ouverture du fichier TOTO.TXT\n");
}

Journalisée

S!m
Hors ligne Hors ligne


Moderateur
GTAOnline Fan Boy
*

Messages: 2260


« Répondre #32 le: 12 Février 2010 à 17:58:09 »

Salut,

il s'agit de la taille de la variable, donc elle dispose de 5 "emplacements"

tu peut y stocker 5 valeurs:

Code:
Tableau[0] = ...;
Tableau[1] = ...;
Tableau[2] = ...;
Tableau[3] = ...;
Tableau[4] = ...;

++Sim++
Journalisée





vincentdu90
Hors ligne Hors ligne


GTAOnline Big Member
*

Lua , Php/MySQL & Html/Css

Messages: 507


« Répondre #33 le: 12 Février 2010 à 20:54:08 »

Ok merci et donc quand on ecrit dessus on doit préciser l'empllacement dans la variable ?
Journalisée

S!m
Hors ligne Hors ligne


Moderateur
GTAOnline Fan Boy
*

Messages: 2260


« Répondre #34 le: 12 Février 2010 à 22:38:56 »

Salut,

oui excepté si tu stock par exemple du texte ou un autre tableau

par exemple:

Code:
new Tableau1[100] = {12, 13, 14..};
new Tableau2[100];

printf("%c", Tableau1[34]);//écrit un charactère dans la console
print(Tableau1);//écrit tous les charactères

Tableau2 = Tableau1;//valide seulement pour des tableaux de meme taille

bonne chnace Clin d'oeil

++Sim++
Journalisée





S!m
Hors ligne Hors ligne


Moderateur
GTAOnline Fan Boy
*

Messages: 2260


« Répondre #35 le: 05 Avril 2010 à 04:20:27 »

Salut,

tout d'abord désolé du double post...

après avoir fait quelques test, il me semble qu'une information donnée dans ce tuto est inexacte:
Le valeur de retour de fseek donne le déplacement effectué dans le fichier en octet.
Par exemple, si l'index de lecture est positionné au début du fichier alors
Code:
fseek (Fic, 18, seek_start);
renverra 18 et
Code:
fseek (Fic, 0, seek_end); //Dernier octet du fichier
renverra la taille du fichier.

voilà, il semblerait que la fonction fseek ne retourne pas la position dans le fichier, après quelques test avec ce code:

Code:
new pos;
new File:filetmp = ftemp();
fwrite(filetmp, "teststring\r\ntesttest\r\n");
fwrite(filetmp, "test\r\n");
fwrite(filetmp, "test\r\n");
for(new i = 0; i < 25; i++)
{
pos = fseek(filetmp, i);
printf("Position du pointeur: %d", pos);
}
fclose(filetmp);

le log se trouve à être:

Citation
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0
[22:13:07] Position du pointeur: 0

donc voilà, soit je me suis trompé (hors j'en doute, j'ai d'ailleurs testé ftemp avec une écriture et lecture avant pour vérifier que ça fonctionnais) soit l'information est inexacte, ce qui d'ailleurs me dérange, il aurait été fort pratique de pouvoir récupérer la position du pointeur.... (ou le déplacement)
donc, si quelqu'un pouvait tester et confirmer question de savoir si le problème vient de moi ou si vraiment fseek ne retourne rien d'interessant

++Sim++
Journalisée





Syg
Expert programmeur C/C++/PAWN
Hors ligne Hors ligne


Administrateur
GTAOnline Legend
*

The GTAOnline Jesus

Messages: 3760


« Répondre #36 le: 06 Avril 2010 à 17:48:50 »

Il est vrai que le retour de cette fonction n'est pas documenté, j'ai simplement interpolé en comparant cette fonction avec celle qui existe en C (et qui renvoie le déplacement).
Il y a eu une correction de cette fonction dans la R5 mais elle ne semble pas porter sur le retour de la fonction.
Cette fonction renvoie toujours 0 ce qui est effectivement bien dommage.

Par contre, le résultat de ton code ne montre pas que la fonction fseek est buguée.
La fonction ftemp() crée un fichier temporaire (en mémoire) vide.
Tes écriture successives positionne le pointeur du fichier à la fin du fichier.
L'appel de fseek avec une valeur de déplacement positive va chercher à positionné le pointeur au delà de la fin du fichier, ce qui n'est pas possible, il est donc normal que la fonction te renvoie 0 car le déplacement du pointeur de fichier n'a pas été fait.

Voici par exemple le bout de script qu'il faut écrire pour montrer que ça ne fonctionne pas :
Code:
new pos;
new Toto[1+1];
new File:filetmp = ftemp ();
fwrite(filetmp, "012345678901234567890\r\ntesttest\r\n");
fwrite(filetmp, "test\r\n");
fwrite(filetmp, "test\r\n");
pos = fseek (filetmp, 7, seek_start);
printf("Position du pointeur: %d", pos);
fread (filetmp, Toto[0], 2);
printf ("Toto = %s", Toto);
fclose(filetmp);

Resultat :
[17:44:19] Position du pointeur: 0
[17:44:19] Toto = 7

La valeur de pos est 0 alors qu'elle devrait être de 7.
Mais le fichier est lu correctement, ce qui indique que fseek rempli sa fonction.

++
Syg
Journalisée

Courtesy of GtaManiac
S!m
Hors ligne Hors ligne


Moderateur
GTAOnline Fan Boy
*

Messages: 2260


« Répondre #37 le: 06 Avril 2010 à 18:49:31 »

Salut,

content de voir qu'on arrive à la même conclusion Tire la langue

je manquais certainement de clarté.

seule la valeur de retour de fseek n'est pas ce que l'on voudrait qu'elle soit, cela aurait été vraiment pratique, peut-être le demandé pour une prochaine version...je vais aller le faire de ce pas

EDIT:
tant qu'à y être, j'aimerais demandé une petite aide concernant un problème rencontré récemment.
Est-il possible de réduire la taille d'un fichier sans tout effacer (io_write ou fremove...)
j'ai testé en utilisant le caractère qui je crois marque la fin d'un fichier (ou d'un bloc?) (EOF) mais rien n'y fait, ça ne donne aucun résultat valable, ce serait pour produire un système de gestion de fichier simple et aussi rapide que possible..
en résumé, je voudrais pouvoir supprimer seulement une petite partie du fichier sans passer par un fichier temporaire

++Sim++
« Dernière édition: 06 Avril 2010 à 18:59:41 par Sim » Journalisée





Syg
Expert programmeur C/C++/PAWN
Hors ligne Hors ligne


Administrateur
GTAOnline Legend
*

The GTAOnline Jesus

Messages: 3760


« Répondre #38 le: 06 Avril 2010 à 22:54:47 »

Malheureusement non, il n'est pas possible de modifié directement la taille d'un fichier comme en C où on dispose de la fonction chsize (qui permet d'étendre ou de tronquer un fichier) on ne peut que le lire au moyen de la fonction flength.

Et il n'y a plus de caractère de fin de fichier (d'ailleurs ce n'était valable que pour les fichiers textes et ça remonte à la préhistoire Sourire ).
Maintenant, la totalité des fichiers sont en binaires, même si ils ne contiennent que des caractères textes et leur taille est stockées dans le système de fichier.

Tu n'as pas d'autre solution que de passer par un fichier temporaire.
L'avantage c'est que ta fonction pourra permettre d'enlever ou d'ajouter un morceau à n'importe quel endroit du fichier, pas seulement à la fin.

++
Syg
Journalisée

Courtesy of GtaManiac
Boomerkuigi
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 63


« Répondre #39 le: 23 Décembre 2010 à 07:59:59 »

Merci pour ce jolie tuto  ^^ 
J'aimerai savoir comment faire par lire/ecrire sur un fichier mais a une position particulière genre " 10e caractères " parce que dans les parametre de fopen() / fread() j'ai pas vu le parametre position et j'ai cru lire dans les postes precendent que fseek() renvoyai toujours 0 !
Journalisée

Xartrick
Hors ligne Hors ligne


Moderateur
GTAOnline Addict
*

C & Pawn Programmer

Messages: 1206


WWW
« Répondre #40 le: 23 Décembre 2010 à 10:55:10 »

La réponse est dans la partie quatre de ce tutoriel.
Journalisée

cristab
Hors ligne Hors ligne


Admin V.I.P
GTAOnline Legend
*

Messages: 7333


« Répondre #41 le: 04 Janvier 2011 à 20:30:16 »

coucou juste une question il y aurais t'il une possibiliter d'une fonction identique
fpassthru(file[])
Journalisée

Pages: 1 2 [3]   Haut de page
Imprimer
Aller à:  

Theme créé par padexx et modifié par GTAOnline.fr
Page générée en 0.279 secondes avec 23 requêtes.
Forum GTAOnline.fr 2.0 | Design par : Lalu et GtaManiac
Merci a toute la communaute pour son support !
Copyright © 2004-2012 - GTAOnline.fr | GTAPro.com | Contact