1

J'avais posé cette question sur ce sujet il y a quelques temps, mais je n'arrive toujours pas à m'en sortir tout seul (j'ai lu la doc des fonctions fputs, fclose, ...).
Prenons pas exemple quatres int : a, b, c, d.
Quel est le code pour stoker ces variables dans un fichier externe au programme, nommé par exemple "save" ?
Quel est le code pour récupérer à partir du fichier ces 4 variables ?

2

c'est plutot mal vu de demander directement le code "pret à être recopié", mais voilà à peu près la méthode :

- fopen te permet d'ouvrir un fichier, en indiquant en 1er son nom (ou son chemin complet, dans le premier cas il sera recherché dans le dossier courant), et en second le mode d'ouverture. Ce mode peut être soit "r" (read, lecture), soit "w" (write, écriture), soit "a" (append, écriture à la fin), avec éventuellement un "+" qui complique les choses (et que tu devrais oublier pour le moment ^^), et un "b" optionnel qui signifie que tu travailles sur un fichier binaire et non pas un fichier de type TEXT (il y a quelques différences, par exemple au niveau des retours à la ligne). Pour résumer, dans ton cas tu vas avoir besoin de "rb" pour lire ton fichier, et "wb" pour l'écrire. La fonction retourne un pointeur de type "FILE *", qui correspond à ton fichier ouvert, et que tu dois passer en paramètre à toutes les fonctions de manipulation de fichier.

- fwrite sert à écrire dans ton fichier, en indiquant en premier le buffer qui contient les données, ensuite la taille d'une "case" du buffer, le nombre de cases, et enfin le "FILE *" que t'a retourné fopen. Si tu as un "char buffer[16];" et que tu veux l'écrire dans un fichier, ça sera "fwrite(buffer, sizeof (char), 16, file)", si tu as un "int plop;", ça sera "fwrite(&plop, sizeof (int), 1, file)", etc...

- fread fonctionne comme fwrite mais pour la lecture, le buffer que tu passes en paramètre ne sert donc plus de source mais de destination, les données que tu lis dans le fichier y seront copiées.

- fclose te permet de fermer le fichier, c'est *indispensable* une fois que tu as fini de t'en servir. Elle ne prend en paramètre que le "FILE *".

Pour résumer, si tu veux écrire des entiers "int a, b, c, d" dans un fichier, ton code devrait ressembler à ça :
FILE *file;
int a, b, c, d;

file = fopen("save", "wb"); // crade, si fopen échoue elle retourne NULL, il faudrait le vérifier
fwrite(&a, sizeof (int), 1, file); // crade aussi, le fwrite peut échouer (si il n'y a plus de ram par exemple)
fwrite(&b, sizeof (int), 1, file);
fwrite(&c, sizeof (int), 1, file);
fwrite(&d, sizeof (int), 1, file);
fclose(file);

Pour lire, c'est exactement la même chose en remplaçant "wb" par "rb" et "fwrite" par "fread". Je t'invite à lire la doc de stdio.h pour connaitre le fonctionnement des (nombreuses) autres fonctions disponibles.

P.S : les fonctions de stdio.h sont peu utilisées sur Ti puisqu'elles sont lentes et qu'il existe une autre méthode très efficace. Mais l'avantage de celle-ci c'est qu'elle fonctionnera aussi si tu programmes sur pc.
P.P.S : il faudrait pê attendre un peu avant d'avoir un nick comme ça ? ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Merci beaucoup, je comprends mieux avec un exemple concret. Dans la documentation de Tigcc, pour la fonction fopen, par exemple, je lis : fopen opens the file named by filename (this is a normal C string, which should be in lowercase) and associates a stream with it.
Que veut dire "stream". J'ai cherché dans un dictionnaire, mais je comprends pas bien le sens de ce mot en programmation.

4

Stream c'est un flux. En C ici ca correpond a ton pointeur sur un FILE.
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

5

Comment fait-on pour tester si mon fichier "save" est déjà créé ou non dans un dossier donné (par exemple "main") ?

6

Hmm y'a des fonctions du TiOS pour faire ça, mais sinon avec celles que tu connais tu peux faire un fopen("fichier", "r") : si ça réussit il existe (ne pas oublier de le fermer), sinon il n'existe pas. A savoir aussi que le mode "w" crée le fichier si il n'existait pas, idem pour "a".
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

7

Y a-t-il une fonction ou une technique pour savoir combien de place prendra dans la ram le fichier "save", et tester s'il y en a assez avant d'effectuer l'opération d'écriture dans ce fichier ?

8

je suis pas sûr que soit facile à faire de façon 100% fiable (sachant qu'il peut éventuellement y avoir redimensionnement de la VAT etc...), le plus propre serait de créer le fichier que tu veux avec un nom différent, puis si tu constates qu'il n'y a pas eu d'erreur de supprimer l'ancien et renommer le nouveau... (et dans le cas contraire ne pas oublier de supprimer le fichier temporaire)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)