Question sur la lecture/écriture de fichier en C
Posté le 24/12/2014 14:15
Salut à tous,
J'utilise pour le jeu que je suis en train de créer un fichier de sauvegarde, comportant 30 valeurs, toutes des Int. J'initialise ce fichier avec mes valeurs par défaut comme ceci:
void createSaveFile()
{
[purple]int[/purple] initValues[30];
memory_createfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],[maroon]30[/maroon]*sizeof(int));
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_WRITE);
memory_writefile(handle,initValues,30*sizeof(int));
memory_closefile(handle);
}
et je les lis comme ceci:
int buffer[30];
void loadSaveFile()
{
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_READ);
memory_readfile(handle,buffer,30*sizeof(int),[maroon]0[/maroon]);
memory_closefile(handle);
}
Maintenant, ce que j'aimerais faire, c'est pouvoir stocker plusieurs types de valeurs dans le fichier, par exemple j'aimerai pouvoir avoir un initValue[30] de type Int qui stocke 30 Int dans le fichier, et à la suite un InitValue2[20] de type Short qui stocke 20 Short dans ce même fichier à la suite, et du coup quand je lis le fichier, les 50 valeurs sont stockées dans 2 tableaux: int buffer[30] et short buffer2[20], pourriez-vous m'expliquer comment je dois procéder ?
Merci !
Citer : Posté le 24/12/2014 14:34 | #
Tu lis séparement
Par exemple, tu lis les 30 int, puis après les 20 short etc tu peux pas lire d'un coup
int buffer_int[30];
short buffer_short[20];
void loadSaveFile()
{
handle = memory_openfile("\\\\fls0\\JETPACK.SAV",_OPENMODE_READ);
memory_readfile(handle,buffer,30*sizeof(int),0);
memory_readfile(handle,buffer,20*sizeof(short),30*sizeof(int));
memory_closefile(handle);
}
Citer : Posté le 24/12/2014 14:36 | #
Donc
memory_readfile(handle,buffer,30*sizeof(int),0);
memory_readfile(handle,buffer2,20*sizeof(short),0);
Ça marche, tout simplement? Je sais bien qu'on peut pas lire les deux en même temps mais je ne sais pas comment les lire séparément !
Ajouté le 24/12/2014 à 14:37 :
Ah ok merci beaucoup !
Citer : Posté le 24/12/2014 15:02 | #
Sinon le plus propre reste la structure de sauvegarde
Tu écris tes données dedans, et tu lis tout d'un coup.
Citer : Posté le 24/12/2014 15:05 | #
Ca n'a pas l'air de marcher...
Je crée mon fichier comme ça :
{
[purple]char[/purple] initValues[39] = {[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]10[/maroon],[maroon]2[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]2[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon]};
[purple]int[/purple] initValues_int[10] = {[maroon]99999[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon],[maroon]0[/maroon]};
memory_createfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],[maroon]39[/maroon]*sizeof(char));
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_WRITE);
memory_writefile(handle,initValues,[maroon]39[/maroon]*sizeof(char));
memory_writefile(handle,initValues_int,[maroon]10[/maroon]*sizeof(int));
memory_closefile(handle);
}
Et je le lis comme ça:
char buffer[39];
int buffer_int[10];
void loadSaveFile()
{
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_READ);
memory_readfile(handle,buffer,[maroon]39[/maroon]*sizeof(char),[maroon]0[/maroon]);
memory_readfile(handle,buffer_int,[maroon]10[/maroon]*sizeof(int),[maroon]39[/maroon]*sizeof(char));
memory_closefile(handle);
}
Pourtant quand je cherche à accéder à la valeur de buffer_int[0], il m'indique 0 au lieu de 99999...
Ajouté le 24/12/2014 à 15:06 :
@DarkStorm: Oui, lephe m'en avait parlé, comment je dois procéder ? Et ça ne va pas prendre plus de place ? (car je cherche à séparer les short des int pour un problème de taille)
Citer : Posté le 24/12/2014 17:09 | #
essaye avec ça
Citer : Posté le 24/12/2014 17:38 | #
typedef struct
{
int valeurs_1[20];
char valeurs_2[10];
short autre_valeur;
// etc.
} Save;
// Dans le .c
void create_save_file(Save *sauvegarde)
{
memory_createfile("\\\\fls0\\JETPACK.SAV", sizeof(Save));
handle = memory_openfile("\\\\fls0\\JETPACK.SAV", _OPENMODE_WRITE);
memory_writefile(handle, sauvegarde, sizeof(Save));
memory_closefile(handle);
}
Save *load_save_file(void) // Soit tu libère les pointeurs une fois que tu veux mettre à jour le fichier, soit tu passes le pointeur en argument et tu modifie ensuite. Là j'ai fait la première option.
{
Save *sauvegarde = (Save*)malloc(sizeof(Save)); // On créé un pointeur
handle = memory_openfile("\\\\fls0\\JETPACK.SAV", _OPENMODE_READ);
memory_readfile(handle, sauvegarde, sizeof(Save), 0);
memory_closefile(handle);
return sauvargarde;
}
// Pour y accéder :
Save *sauvegarde = NULL; // On créé un pointeur
sauvegarde = load_save_file(); // Pour charger
sauvegarde.valeurs_1[10] = 99999;
create_save_file(&sauvegarde); // Pour sauvegarder
Citer : Posté le 24/12/2014 18:03 | #
Ok, mais ça prends pas plus de place ?
Et Save *load_save_file(void), j'ai pas compris ce que c'est, c'est un pointeur de fonction de type Save qui prends comme paramètre void ? J'ai rien compris
Citer : Posté le 24/12/2014 18:15 | #
C'est une fonction qui retourne un pointeur sur une structure de type Save.
Et non, ça ne prend la place que de ce que tu met dans la structure.
Citer : Posté le 24/12/2014 19:19 | #
Alors voici ce que j'ai fait :
typedef struct
{
[purple]char[/purple] gadget[12];
[purple]char[/purple] gadgetEquipe[2];
[purple]char[/purple] tenue[6];
[purple]char[/purple] tenueEquipe[1];
[purple]char[/purple] jetpack[4];
[purple]char[/purple] jetpackEquipe[1];
[purple]char[/purple] ameliorationNOIR[6];
[purple]char[/purple] ameliorationAIMANT[6];
[purple]int[/purple] argent;
}Save;
Save *loadSaveFile(void);
void createSaveFile(Save *sauvegarde);
void saveAndQuit();
[green]// menu.c[/green]
Save *sauvegarde = NULL;
Save *loadSaveFile(void)
{
[b][blue]if[/blue][/b] (memory_exists([gray]"\\\\fls0\\JETPACK.SAV"[/gray]) != [maroon]1[/maroon])
createSaveFile(&sauvegarde);
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_READ);
memory_readfile(handle,sauvegarde,sizeof(Save),[maroon]0[/maroon]);
memory_closefile(handle);
[b][blue]return[/blue][/b] sauvegarde;
}
void createSaveFile(Save *sauvegarde)
{
memory_createfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],sizeof(Save));
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_WRITE);
memory_writefile(handle,sauvegarde,sizeof(Save));
memory_closefile(handle);
}
void saveAndQuit()
{
memory_deletefile([gray]"\\\\fls0\\JETPACK.SAV"[/gray]);
memory_createfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],sizeof(Save));
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_WRITE);
memory_writefile(handle,sauvegarde,sizeof(Save));
memory_closefile(handle);
}
[green]// main.c[/green]
extern Save *sauvegarde;
sauvegarde = load_save_file();
[b][blue]if[/blue][/b] (sauvegarde.gadget[0] == [maroon]1[/maroon]) [b][blue]return[/blue][/b] 0; [green]// l'erreur ici[/green]
Pourtant lorsque j'exécute, il m'indique une erreur à la toute dernière ligne de main.c, C2203 (E) Illegal member reference for ".", à quoi cela est du ?
Citer : Posté le 24/12/2014 21:39 | #
Sauvegarde est un pointeur : tu doit faire (*sauvegarde).gadget[n]
Mais vu que les programmeurs sont des feignants, tu peux remplacer par ça : sauvegarde- >gadget[n] (sans l'espace)
Aussi, vu que c'est déjà un pointeur, il ne faut pas mettre le & lorsque tu passe sauvegarde en argument
Citer : Posté le 25/12/2014 00:49 | #
D'accord merci, mais autre petit problème :
Voici mon nouveau code:
typedef struct
{
[purple]char[/purple] gadget[12];
[purple]char[/purple] gadgetEquipe[2];
[purple]char[/purple] tenue[6];
[purple]char[/purple] tenueEquipe;
[purple]char[/purple] jetpack[4];
[purple]char[/purple] jetpackEquipe;
[purple]char[/purple] ameliorationNoir[6];
[purple]char[/purple] ameliorationAimant[6];
[purple]int[/purple] argent;
}Save;
Save *loadSaveFile(void);
void createSaveFile(Save *sauvegarde);
[green]// Menu.c[/green]
Save *sauvegarde = NULL;
[purple]int[/purple] handle;
Save *loadSaveFile(void)
{
[b][blue]if[/blue][/b] (memory_exists([gray]"\\\\fls0\\JETPACK.SAV"[/gray]) != [maroon]1[/maroon])
createSaveFile(sauvegarde);
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_READ);
memory_readfile(handle,sauvegarde,sizeof(Save),[maroon]0[/maroon]);
memory_closefile(handle);
[b][blue]return[/blue][/b] sauvegarde;
}
void createSaveFile(Save *sauvegarde)
{
[green]//sauvegarde = NULL;[/green]
[green]//sauvegarde[b]->[/b]argent = [maroon]99999[/maroon];[/green]
[green]//sauvegarde[b]->[/b]tenue[0] = [maroon]2[/maroon];[/green]
[green]//sauvegarde[b]->[/b]jetpack[0] = [maroon]2[/maroon];[/green]
[green]//memory_createfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],sizeof(Save));[/green]
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_WRITE);
memory_writefile(handle,sauvegarde,sizeof(Save));
memory_closefile(handle);
}
[green]// Main.c[/green]
extern Save *sauvegarde;
memory_deletefile([gray]"\\\\fls0\\JETPACK.SAV"[/gray]);
sauvegarde = loadSaveFile();
J'ai un problème au niveau des 5 lignes que j'ai mises en commentaire dans createSaveFile, si je lance l'appli comme ça, tout marche bien jusqu'à ce que j'essaye de modifier une valeur de sauvegarde dans mon code où l'émulateur crash (SYSTEM ERROR), si j'enlève un des 4 premiers commentaires, l'émulateur crash directement à la ligne correspondante avec un SYSTEM ERROR, et enfin si j'enlève le dernier commentaire, l'émulateur plante avec une fenêtre d'erreur "Execution has stopped due to an error. Exception blocked reset" (ce que je n'avais jamais vu avant).
Pour quelles raisons ai-je ces problèmes, et comment les résoudre ?
Merci!
Citer : Posté le 25/12/2014 02:13 | #
Ah, les EBR :demon:
Plus sincèrement, je ne te conseille pas de créer une variable globale dans ton menu.c. Théoriquement; le passage de pointeurs résoud tout, pas besoin de s'embêter avec des globales. Surtout que dans ton cas il y a un conflit entre "sauvegarde" (la globale) et "sauvegarde" (le paramètre). Je ne sais pas comment le compilo s'y retrouve
Fait gaffe aussi à l'ordre d'appel des fonctions : c'est bien sympa de déclarer un pointeur, mais si t'essaie d'accéder à une partie de la structure alors que ton pointeur est encore NULL, ça pose problème.
J'ai pas le temps ni la motiv' de regarder en détail ton code (je reconnais aussi que sur mobile c'est pas top), mais si j'y pense demain, j'essaierai de te poster un exemple
Citer : Posté le 25/12/2014 10:50 | #
C'est bon j'ai réussi à résoudre mon problème au final, c'était bien une histoire de conflit avec sauvegarde et une ligne que j'ai oublié^^ voici le code fonctionnel:
typedef struct
{
[purple]char[/purple] gadget[12];
[purple]char[/purple] gadgetEquipe[2];
[purple]char[/purple] tenue[6];
[purple]char[/purple] tenueEquipe;
[purple]char[/purple] jetpack[4];
[purple]char[/purple] jetpackEquipe;
[purple]char[/purple] ameliorationNoir[6];
[purple]char[/purple] ameliorationAimant[6];
[purple]int[/purple] argent;
}Save;
Save *loadSaveFile(void);
void createSaveFile(Save *save);
extern Save *sauvegarde;
[green]// menu.c[/green]
Save *loadSaveFile(void)
{
Save *save = (Save*)malloc(sizeof(Save));
[b][blue]if[/blue][/b] (memory_exists([gray]"\\\\fls0\\JETPACK.SAV"[/gray]) != [maroon]1[/maroon])
createSaveFile(save);
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_READ);
memory_readfile(handle,save,sizeof(Save),[maroon]0[/maroon]);
memory_closefile(handle);
[b][blue]return[/blue][/b] save;
}
void createSaveFile(Save *save)
{
save[b]->[/b]argent = [maroon]99999[/maroon];
save[b]->[/b]tenue[0] = [maroon]2[/maroon];
save[b]->[/b]jetpack[0] = [maroon]2[/maroon];
memory_createfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],sizeof(Save));
handle = memory_openfile([gray]"\\\\fls0\\JETPACK.SAV"[/gray],_OPENMODE_WRITE);
memory_writefile(handle,save,sizeof(Save));
memory_closefile(handle);
}
[green]// main.c[/green]
Save *sauvegarde = NULL;
sauvegarde = loadSaveFile();
Et j'utilise le extern car j'ai besoin des valeurs de ma sauvegarde dans plusieurs .c en fait, pas que dans main.c et menu.c
Citer : Posté le 25/12/2014 12:37 | #
Là en effet ça me paraît mieux