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
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 :
donnees = memory_load("\\fls0\fichier.sav"); // lecture
// ...
memory_save("\\fls0\fichier.sav", donnees, sizeof(*donnees); // ecriture
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 ?
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.
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 ?
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.