CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Besoin d'un codeur en C

Darlinginthe002
Darlinginthe002
Niveau 18
02 juin 2020 à 17:41:23

Yop.

J'aurais besoin de khey qui sachent bien codé en C.

Pour ma première année j'ai comme travaille à rendre un jeu du pendu.

Hors il nous est demandé de créer un jeu du pendu, donc on dois pouvoir régler la difficulté grâce à 5 ficheirs différents.

Hors je n'arrive pas à comprendre comment je pourrais faire, est-ce qu'il est possible de changer tout seul le fichier à ouvrir grâce à la fonciton FOPEN avec une variable?

Genre à la place de mettre fopen("facile.txt", "r") il n'y aurais pas moyen de faire fopen("variable", "r") ?
Sinon je dois faire ça à coup de IF et mettre une variable supplémentaire dans ma fonction?
Merci d'avance !

Message édité le 02 juin 2020 à 17:42:53 par Darlinginthe002
Luzhog
Luzhog
Niveau 10
02 juin 2020 à 17:51:35

tu peut très bien passer une variable (char *) a ton fopen

char nom_fichier[15];
strcpy(nom_fichier, "ton_fichier");
fopen(nom_fichier, "r");

normalement d'après la doc

Darlinginthe002
Darlinginthe002
Niveau 18
02 juin 2020 à 18:04:00

Le 02 juin 2020 à 17:51:35 Luzhog a écrit :
tu peut très bien passer une variable (char *) a ton fopen

char nom_fichier[15];
strcpy(nom_fichier, "ton_fichier");
fopen(nom_fichier, "r");

normalement d'après la doc

Je vais essayer ça merci. Après j'ai du mal à mettre une variable supplémentaire dans la fonction pour une raison que j'ignore. Mais bon je maîtrise pas assez.

Message édité le 02 juin 2020 à 18:04:15 par Darlinginthe002
89ron
89ron
Niveau 10
02 juin 2020 à 18:26:09

Non le FOPEN c'est juste une operation systeme qui ne fait qu'ouvrir un fichier dans un mode particulier, cependant la fonction FOPEN renvoi un handle de type FILE* : un pointeur sur FILE (un identifiant ou variable qui permet d’identifier ta ressource ouverte : aka le fichier).

  1. tu ouvre un handle vers ton fichier
  2. tu utilise ce handle pour lire ou ecrire (depend du mode lors de l'ouverture)
  3. tu ferme ton fichier avec FCLOSE(Le_handle) en dernière opération.

#include <stdio.h>

int main () {
   FILE *fp; /* le handle */
   int c; /* la variable qui va recevoir les données caractère par caractère */
  
   fp = fopen("file.txt","r"); /* ouverture du fichier file.txt dans le même répertoire que l’exécutable, en mode lecture */
   if (fp == NULL) { /* si le handle est NULL, c'est qu'il c'est passer quel que chose de pas normal avec FOPEN 
       perror("Erreur a l'ouverture du fichier") ;  /* affiiche le message d'erreur */
       return(-1); /* quitter l'application en renvoyant -1 qui est synonyme d'erreur. */
   }
   while(1) { /*boucle infin*/
      c = fgetc(fp); /* recuperrer un caractère et l'envoyer dans la variable C. */
      if( feof(fp) ) {  /* verifier si on a atteint la fin du fichier */
         break ;  /* sortir de la boucle infini si c'est le cas */
      }
      printf("%c", c); /* afficher la valeur de C sur la sortie standard (l'ecran) en tant que caractere. */
   }
   fclose(fp); /* fermer le handle (aka le fichier ouvert)
   
   return(0); /* quitter l'application en indiquant que tout c'est tres bien passer. */
}
89ron
89ron
Niveau 10
02 juin 2020 à 18:33:46

PS : FGETC. va lire un caractère du fichier puis l'envoyer vers la variable c et déplacer la tête de lecture vers le prochain caractère a lire lors de la prochaine itération de la boucle.

Le programme ouvre le fichier file.txt et le lit caractère par caractère en les affichant un par un a chaque itération de la boucle infini qui ne s’arrêtera que lorsque la tête de lecture atteindra la fin du fichier appeler aussi : EOF pour End Of File.

Darlinginthe002
Darlinginthe002
Niveau 18
02 juin 2020 à 20:23:41

J'ai un peu avancer mais je rencontre des problèmes.

Voici la partie du main .c qui nous intéresse:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#include "dico.h"

int gagne(int lettreTrouvee[], long tailleMot);
int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
char lireCaractere();

int main(int argc, char* argv[])
{
    char lettre = 0; // Stocke la lettre proposée par l'utilisateur (retour du scanf)
    char motSecret[100] = {0}; // Ce sera le mot à trouver
    int *lettreTrouvee = NULL; // Un tableau de booléens. Chaque case correspond à une lettre du mot secret. 0 = lettre non trouvée, 1 = lettre trouvée
    long coupsRestants = 6; // Compteur de coups restants (0 = mort)
    long i = 0; // Une petite variable pour parcourir les tableaux
    long tailleMot = 0;
    int options = 0; // Variable permettant de se balader dans les menus du jeu
    int modeDeJeu=1; //Permet de choisir le mode de jeu, mit par defaut sur <visible>
    int difficulte=1; // Permet de choisir le mode de difficulte du jeu, mit par defaut sur <moyen>
 if (!piocherMot(motSecret, difficulte))
            exit(0);

Voici le dico.c:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#include "dico.h"


int piocherMot(char *motPioche, int difficulte)
{
    FILE* dico = NULL; // Le pointeur de fichier qui va contenir notre fichier
    int nombreMots = 0, numMotChoisi = 0, i = 0;
    int caractereLu = 0;
    char mode[5][20]={"facile.txt", "normal.txt", "difficile.txt", "tresdifficile.txt", "extreme.txt"};

    dico = fopen(mode[difficulty], "r"); // On ouvre le dictionnaire en lecture seule

    // On vérifie si on a réussi à ouvrir le dictionnaire
    if (dico == NULL) // Si on n'a PAS réussi à ouvrir le fichier
    {
        printf("\nImpossible de charger le dictionnaire de mots");
        return 0; // On retourne 0 pour indiquer que la fonction a échoué
        // A la lecture du return, la fonction s'arrête immédiatement.
    }

    // On compte le nombre de mots dans le fichier (il suffit de compter les
    // entrées \n
    do
    {
        caractereLu = fgetc(dico);
        if (caractereLu == '\n')
            nombreMots++;
    } while(caractereLu != EOF);

    numMotChoisi = nombreAleatoire(nombreMots); // On pioche un mot au hasard

    // On recommence à lire le fichier depuis le début. On s'arrête lorsqu'on est arrivés au bon mot
    rewind(dico);
    while (numMotChoisi > 0)
    {
        caractereLu = fgetc(dico);
        if (caractereLu == '\n')
            numMotChoisi--;
    }

    /* Le curseur du fichier est positionné au bon endroit.
    On n'a plus qu'à faire un fgets qui lira la ligne */
    fgets(motPioche, 100, dico);

    // On vire l'\n à la fin
    motPioche[strlen(motPioche) - 1] = '\0';
    fclose(dico);

    return 1; // Tout s'est bien passé, on retourne 1
}

int nombreAleatoire(int nombreMax)
{
    srand(time(NULL));
    return (rand() % nombreMax);
}

Comme ça le programme se finit tout simplement dans je fait une nouvelle partie, mon printf pour le chargement de dictionnaire ne marche même pas. :(

Je ne comprend pas pourquoi...

Si vous avez besoin du main complet n'hésitez pas

(POur le mode visible/intermédiaire/invisible, n'y faites pas attention j'implanterai ça plus tard)

Message édité le 02 juin 2020 à 20:24:58 par Darlinginthe002
89ron
89ron
Niveau 10
03 juin 2020 à 02:46:40

Quand tu lits le fichier une première fois ta tête de lecture arrive a la fin de celui-ci, pour pouvoir le relire il faut repositionner celle-ci au début du fichier avec la commande la fonction fseek.


int fseek(FILE *stream, long int offset, int whence)

Pour retourner au debut du fichier il faut utiliser :


/* Deplacement de la tete de lectyre au debut du fichier ouvert en cours.*/
if (fseek(dico, 0, SEEK_SET) < 0) 
{
    /* Afficgage et sortie du la function en cas d'erreur. */
    perror("Erreur de déplacement de la tete de lecture");
    return -1; 
}

En C il est d'usage que lorsque une fonction c'est bien passer de renvoyer un 0 (ou une valeur supérieur à 0 lorsque l'on doit renvoyer une information) et en cas d’échec utiliser les nombres négatifs pour les erreurs.

PS : Pour aller plus loin un fois ton programme fonctionnel, tu peux aussi :

  1. Ouvrir le fichier
  2. Positionner la tête de lecture a la fin du fichier
  3. Lire la position du curseur et donc déduire la taille du fichier lut en caractères.
  4. Allouer de la mémoire du tas, cree un buffer et y coupier le fichier d'une traite.
  5. fermer le fichier
  6. Effectuer tes opérations directement sur le buffer (tampon mémoire allouer dans le tas.avec MALLOC et Llberer avec FREE avant de quitter l'application)..
Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment