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

Forum Casio - Autres questions


Index du Forum » Autres questions » Créer et éditer des fichiers
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Créer et éditer des fichiers

Posté le 14/02/2016 22:09

Bonjour,
Je sais qu'il est possible de créer et d'éditer des .* en C, mais j'aimerais savoir quelle fonction le permet et comment écrire et lire dans un fichier .* (.txt par exemple)
Et si possible, comment interpréter le code de ce fichier (création d'un tableau par exemple).

Merci de votre aide


Btl Hors ligne Ancien modérateur Points: 3879 Défis: 107 Message

Citer : Posté le 14/02/2016 22:14 | #


Va sur le wiki de casio
Et regarde à la partie 2 : Fonctions de manipulation des fichiers
Un excellent tuto video qui vous explique comment transférer des fichiers de l'ordinateur vers la calculatrice et vice versa ma chaine youtube
mes jeux
mes jeux

Jouez à 6 sur une seule calto : Curve Fever
Un die and retry qui vous fera bieeeen rager Test Andropov
un très bon sokoban
le seul vrai jeu de foot en basic : FIFA 12
Ca c'est ce que j'appelle un jeu de reflexion jewel master
Qui vaincra l'intelligence artificielle de cet othello
Le célèbre pacman
Et tant d'autres BTL's games

Le jeu du mois de Novembre et award du jeu le plus dur de l'année 2013 MultiTask, testez-le
Fenysk Hors ligne Membre Points: 286 Défis: 0 Message

Citer : Posté le 14/02/2016 22:16 | #


Les convertisseurs en ligne existent-ils pour ce genre de chose ?
==========GAME & WATCH | Casio Edition==========

-Helmet : Traverse la cour sans te faire assommer par les objets !
-Octopus : Ramasse les ressources et ramène-les dans le bateau sans te faire dévorer par la pieuvre !
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

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


Aaaaah c'est la que je l'avais vu ! Merci Btl

C'est pas ce que je veux Fenysk Je veux créer et éditer des fichiers via un prog en C

Lephenixnoir En ligne Administrateur Points: 21390 Défis: 149 Message

Citer : Posté le 14/02/2016 22:38 | #


Matt36230 a écrit :
Et si possible, comment interpréter le code de ce fichier (création d'un tableau par exemple).

Il faudrait préciser ce que tu veux faire avec mais basiquement il faut écrire un interpréteur. Ça peut aller du très simple au très complexe selon le format du fichier.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 14/02/2016 23:12 | #


Ok donc je voudrais lui écrire un truc comme ça :
0 0 0 0 0 0
0 0 1 2 3 4
0 0 5 6 0 0
0 0 7 8 0 0

donc un tableau ou 1 correspondra aux deux valeurs 3 et 2, 4 correspondra a 6 et 2, etc

Pour l'interpréter ça va pas être trop dur
Dark storm En ligne Labélisateur Points: 11549 Défis: 176 Message

Citer : Posté le 15/02/2016 00:52 | #


Si la taille est constante, tu peux te débrouiller simplement avec sscanf.
Exemple pour du 3 * 3 : for(i = 0; i < 3; i++) sscanf(str, "%d %d %d", &tab[ i ][0], &tab[ i ][1], &tab[ i ][2]);
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 15/02/2016 01:18 | #


Je me suis mal exprimer, je ne veux pas les afficher, je veux les exploiter.
Ce tableau va représenter les chunks déjà créés (pour Pirate Hunter). Et me permettra donc de savoir quand je dois créer un nouveau chunk ou piocher dans la sauvegarde.
Dark storm En ligne Labélisateur Points: 11549 Défis: 176 Message

Citer : Posté le 15/02/2016 01:22 | #


J'avais bien compris, sscanf est l'inverse de ssprintf. x)

Sinon, plutôt que de faire un parseur, tu peux écrire directement le binaire du tableau dans le fichier. Ensuite, un memcpy et c'est fini
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 15/02/2016 01:30 | #


Ah d'accord


Désolé mais je n'ai rien compris C'est quoi un parseur ? Et un memcpy ?
Dark storm En ligne Labélisateur Points: 11549 Défis: 176 Message

Citer : Posté le 15/02/2016 01:36 | #


Parser correspond à convertir une chaine de caractères (provenant d'un fichier par exemple) en données exploitables par le programme. Exemple : faire ta conversion, convertir du HTML en éléments affichables, etc.

Le parseur, c'est le sous-programme (ensemble de fonctions en C) qui va permettre de réaliser l'opération.

sscanf permet de parser une chaine de caractères facilement, tant que celle-ci est bien définie (donc nombre de données constants).

memcpy est une fonction qui permet de copier les données d'une zone mémoire vers une autre. Dans ton cas, si la carte est directement stockée sous forme binaire, tu n'as qu'à copier le contenu du fichier vers la zone mémoire (zone pointée par un pointeur qui sert à stocker ta carte sous forme d'un tableau (je sais, c'est long, mais je voulais être clair)) correspondante. Exemple : memcpy(map, file, 3*3);
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 21390 Défis: 149 Message

Citer : Posté le 15/02/2016 08:54 | #


Dark storm a écrit :
Si la taille est constante, tu peux te débrouiller simplement avec sscanf.
Exemple pour du 3 * 3 : for(i = 0; i < 3; i++) sscanf(str, "%d %d %d", &tab[ i ][0], &tab[ i ][1], &tab[ i ][2]);

Oh non... mon dieu !

int fd;
char *buffer, *ptr;
int len_file, len_line;

fd = Bfile_OpenFile(fichier, _OPENMODE_READ);
len_file = Bfile_GetFileSize(fd);
buffer = malloc(taille_du_fichier + 1);
Bfile_ReadFile(fd, buffer, len_file, 0);
Bfile_CloseFile(fd);

ptr = strchr(buffer, '\n');
if(ptr) len_line = ptr - buffer;
else len_line = len_file;

// Acces a un nombre (en supposant que ce soient des chiffres, sans espace)
int entry(int x, int y)
{
    return buffer[len_line * (y + 1) + x];
}

J'ai utilisé vite fait sprintf() pour le CPC, ça m'a rajouté facilement 10 kio à la taille du fichier. On peut peut-être éviter les grosses fonctions pour ça non ? Et puis éviter d'hardcoder la taille du tableau dans le nombre d'arguments, surtout >_<
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 15/02/2016 12:08 | #


Merci DS je comprends à peu près mais mon tableau sera de l'ordre du millier de cases et comme il sera compilé, il n'aura jamais la même taille
Quant à ce que tu dis Lephe je n'ai absolument rien pigé
Lephenixnoir En ligne Administrateur Points: 21390 Défis: 149 Message

Citer : Posté le 15/02/2016 12:20 | #


Je vais supposer que chaque case du tableau est représentée par un et un seul caractère. C'est une bonne optimisation et un peut mettre 95 valeurs facilement, j'espère que ça te suffira. Au pire tu peux passer sur deux chiffres, c'est pas dramatique.

int fd; // handle si tu preferes
char *buffer, *ptr; // buffer pour stocker le tableau charge, pointeur temporaire
int len_file, len_line; // taille du fichier, taille d'une ligne


fd = Bfile_OpenFile(fichier, _OPENMODE_READ);
len_file = Bfile_GetFileSize(fd);
buffer = malloc(taille_du_fichier + 1);
Bfile_ReadFile(fd, buffer, len_file, 0);
buffer[len_file] = 0;
Bfile_CloseFile(fd);

On ouvre le fichier, on récupère sa taille. On alloue de la mémoire pour le charger (on ajoute un octet pour le NUL à la fin), on le charge, on ajoute le NUL à la fin (je l'avais oublié) et on re-ferme le fichier. Bref on charge les données quoi.

ptr = strchr(buffer, '\n');
if(ptr) len_line = ptr - buffer;
else len_line = len_file;

Là on calcule la longueur d'une ligne. Si on peut trouver un '\n' dans le fichier alors la taille d'une ligne est la différence entre l'adresse du premier '\n' et l'adresse du début des données. Sinon (s'il n'y a qu'une ligne), la taille d'une ligne devient la taille du fichier.

// Acces a un nombre (en supposant que ce soient des chiffres, sans espace)
int entry(int x, int y)
{
    return buffer[(len_line + 1) * y + x];
}

On utilise len_line + 1 et pas len_line parce qu'il y a un '\n' par ligne. Encore une erreur de ma part, j'avais mis le +1 sur y tout à l'heure.
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 15/02/2016 13:08 | #


D'accord. Merci Lephe c'est super clair Je m'y plongerais une fois que j'aurai fignolé la génération des chunks


Dark storm En ligne Labélisateur Points: 11549 Défis: 176 Message

Citer : Posté le 15/02/2016 15:12 | #


Lephenixnoir a écrit :
Accès à un nombre (en supposant que ce soient des chiffres, sans espace)

Ben justement, si ça ne l'est pas c'est plus compliqué. J'ai posté une méthode simple à appréhender, pas la plus optimisée
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir En ligne Administrateur Points: 21390 Défis: 149 Message

Citer : Posté le 15/02/2016 15:17 | #


Ça fonctionne pour tous les caractères de toute façon. Si tu te réduit aux imprimables ça laisse 95 choix.

Mais attends, y'a quand même un gouffre entre la lecture de caractère unique et sscanf !
Kirafi Hors ligne Membre Points: 2175 Défis: 10 Message

Citer : Posté le 15/02/2016 18:02 | #


Bah au pire tu utilises la libraire Memory de Lephé , très propre et simple !

Ajouté le 15/02/2016 à 18:05 :
D'ailleurs moi j'utilise toujours ça et je ne change Jamais mes fonctions d'écriture/lecture, quand je crée un nouveau jeu je me les récupères tout le temps (Si tu veux les voir, va regarder les sources d'un de mes Add-In, je te conseille SeaRush c'est le mieux fichu ).
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Matt36230 Hors ligne Membre Points: 1888 Défis: 0 Message

Citer : Posté le 15/02/2016 19:26 | #


Merci Kirafi je vais voir ça

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 - 2022 | Il y a 83 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