Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » Question sur la lecture/écriture de fichier en C
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

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 !


Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

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);
}
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

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 !
Dark storm En ligne Labélisateur Points: 11629 Défis: 176 Message

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.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

Citer : Posté le 24/12/2014 15:05 | #


Ca n'a pas l'air de marcher...

Je crée mon fichier comme ça :

void createSaveFile()
{
    [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)
Intelligide Hors ligne Membre de CreativeCalc Points: 49 Défis: 5 Message

Citer : Posté le 24/12/2014 17:09 | #


memory_readfile(handle,buffer_int,10*sizeof(int),40*sizeof(char));


essaye avec ça
Dark storm En ligne Labélisateur Points: 11629 Défis: 176 Message

Citer : Posté le 24/12/2014 17:38 | #


// Dans le .h

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

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

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
Dark storm En ligne Labélisateur Points: 11629 Défis: 176 Message

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.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

Citer : Posté le 24/12/2014 19:19 | #


Alors voici ce que j'ai fait :

Cliquez pour découvrir
Cliquez pour recouvrir
[green]// menu.h[/green]

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 ?
Dark storm En ligne Labélisateur Points: 11629 Défis: 176 Message

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

Citer : Posté le 25/12/2014 00:49 | #


D'accord merci, mais autre petit problème :

Voici mon nouveau code:

Cliquez pour découvrir
Cliquez pour recouvrir
[green]// Menu.h[/green]

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!
Dark storm En ligne Labélisateur Points: 11629 Défis: 176 Message

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Drakalex007 Hors ligne Membre Points: 687 Défis: 0 Message

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:

Cliquez pour découvrir
Cliquez pour recouvrir
[green]// menu.h[/green]

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
Dark storm En ligne Labélisateur Points: 11629 Défis: 176 Message

Citer : Posté le 25/12/2014 12:37 | #


Là en effet ça me paraît mieux
Finir est souvent bien plus difficile que commencer. — Jack Beauregard

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 v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 65 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