Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Gérer les fichiers en C
Zezombye En ligne Rédacteur Points: 1739 Défis: 13 Message

Gérer les fichiers en C

Posté le 14/07/2016 21:48

Ajouter un système de sauvegarde pour votre addin est une chose assez compliquée à faire, c'est pourquoi je vous fais ce tutoriel.

Créer le fichier

À l'initialisation de votre addin, vous allez sûrement vouloir :
-Ouvrir le fichier;
-Si le fichier n'est pas trouvé, créer le fichier puis l'ouvrir.

Pour cela, il y a deux méthodes : Bfile_OpenFile et Bfile_CreateFile.

Voici donc le code :


//Pour le chemin du fichier, Casio n'accepte que des shorts (pour supporter les caractère multi bytes)
//Il faut donc écrire le chemin caractère par caractère, en n'oubliant pas le 0 à la fin
short filePath[] = {'\\', '\\', 'f', 'l', 's', '0', '\\', /*nom du fichier, toujours caractère par caractère*/, 0};
//On aura besoin de cet int plus tard
int fileHandle;
//On ouvre le fichier, on assigne la valeur de retour à fileHandle
fileHandle = Bfile_OpenFile(filename, _OPENMODE_READWRITE);

//Si fileHandle est négatif, Bfile_OpenFile a retourné un message d'erreur
if (fileHandle < 0) {
    Bfile_CreateFile(filename, /*taille du fichier en octets*/);
    fileHandle = Bfile_OpenFile(filename, _OPENMODE_READWRITE);
}


Quelques commentaires :
-Le mode de Bfile_Openfile peut être : _OPENMODE_READ, _OPENMODE_READSHARE, _OPENMODE_WRITE, _OPENMODE_READWRITE, _OPENMODE_READWRITESHARE. Si vous mettez le "share" ça veut dire que les autres processus ne pourront pas accéder au fichier. La plupart du temps vous voudrez utiliser _OPENMODE_READWRITE (lecture/écriture).

-Pour la taille du fichier, sachez qu'on ne peut travailler qu'avec des shorts (par exemple, si vous avez 90 niveaux et que vous voulez stocker une donnée tenant sur 1 octet, vous devrez créer un fichier de 180 octets). On verra plus tard pourquoi.

Lire le fichier

Pour lire le fichier, on va réutiliser notre fileHandle, et la méthode Bfile_ReadFile().


char buffer[/*taille du buffer*/] = {0};
Bfile_ReadFile(fileHandle, &buffer, /*nombre d'octets à lire*/, /*position du curseur en octets*/);

Il va de soi que le curseur commence à la position 0.

Ecrire dans le fichier

Pour écrire le fichier, on utiliser la méthode Bfile_WriteFile. Toutefois, son prototype ne contient pas d'argument pour la position du curseur, il faudra donc utiliser Bfile_SeekFile.

short dataToWriteToFile[] = {/*...*/};
Bfile_SeekFile(fileHandle, /*position du curseur en octets*/);
Bfile_WriteFile(fileHandle, &dataToWriteToFile, /*nombre d'octets à écrire*/);


Et je vais vous dire maintenant pourquoi il faut travailler avec des shorts : si la position du curseur qu'on envoie à Bfile_SeekFile est impaire, alors ça ne marchera pas. C'est à dire que si on fait Bfile_SeekFile(fileHandle, 0) ça marchera très bien, pareil pour 2, mais pas pour 1. Je tiens bien à préciser que le curseur est en octets, si on met 2 ça viendra écrire à partir du 3e octet (inclus).

Lorsque vous avez fini votre programme, faites Bfile_CloseFile(fileHandler), ce n'est pas obligé mais c'est pour la propreté.

Voilà pour ce tuto, j'espère que ça vous aura été utile




Lephenixnoir Hors ligne Administrateur Points: 20793 Défis: 143 Message

Citer : Posté le 14/07/2016 22:20 | #


C'est pas pour l'esprit de contradiction mais non, c'est pas compliqué... suffit de lire la doc correctement x)

Sinon, ben avec memory :
sauvegarde_t *donnees;
donnees = memory_load("\\fls0\fichier.sav"); // lecture
// ...
memory_save("\\fls0\fichier.sav", donnees, sizeof(*donnees); // ecriture
Vianox Hors ligne Membre Points: 2 Défis: 0 Message

Citer : Posté le 27/03/2020 01:28 | #


Bonjour je code pour une 9860g (casio g75) mais gcc ne reconnais pas Bfile_OpenFile pouvez vous me dire quelle est la bibliothèque ?
Lephenixnoir Hors ligne Administrateur Points: 20793 Défis: 143 Message

Citer : Posté le 27/03/2020 09:36 | #


Salut, c'est dans fxlib. Si tu as suivi un tutoriel pour avoir ton environnement de développement, ça devrait être fourni avec.
Vianox Hors ligne Membre Points: 2 Défis: 0 Message

Citer : Posté le 24/04/2020 21:52 | #


Bonjour, La sur-ecriture se comporte comme un &=, comment ou avec quoi écrire comme un =, si non comment réinitialiser à 0xff des oct du fichier sans tout effacer ?, auriez vous la lib du driver ?
Lephenixnoir Hors ligne Administrateur Points: 20793 Défis: 143 Message

Citer : Posté le 24/04/2020 22:11 | #


La ROM est une flash pas prévue pour être écrite comme ça. Pour récupérer des 1, il faut effacer le secteur, c'est la seule méthode. En pratique, on considère que tout fichier doit être écrit une seule fois et supprimé/recréé à chaque nouvelle écriture.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 47 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd