• 28 Mars 2024, 13:01:57


Auteur Sujet: Les fonctions de gestion des fichiers  (Lu 23992 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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++





vincentdu90

  • Invité
Re : Les fonctions de gestion des fichiers
« Réponse #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 :

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");
}


Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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:

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

++Sim++





vincentdu90

  • Invité
Re : Les fonctions de gestion des fichiers
« Réponse #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 ?

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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:

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 ;)

++Sim++





Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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
fseek (Fic, 18, seek_start);renverra 18 et
fseek (Fic, 0, seek_end); //Dernier octet du fichierrenverra 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:

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:

Citer
[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++





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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 :
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
Courtesy of GtaManiac

Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #37 le: 06 Avril 2010, 18:49:31 »
Salut,

content de voir qu'on arrive à la même conclusion :P

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++
« Modifié: 06 Avril 2010, 18:59:41 par Sim »





Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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 :) ).
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
Courtesy of GtaManiac

Hors ligne Boomerkuigi

  • *
  • Tueur
  • Messages: 63
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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 !

Hors ligne Xartrick

  • *
  • C & Pawn Programmer
  • Messages: 1391
    • Voir le profil
    • Xartrick's Area
Re : Les fonctions de gestion des fichiers
« Réponse #40 le: 23 Décembre 2010, 10:55:10 »
La réponse est dans la partie quatre de ce tutoriel.

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : Les fonctions de gestion des fichiers
« Réponse #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[])
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici