Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture de fichiers avec fopen

    1 mai 2018 à 14:06:21

    Bonjour à tous et à toutes !

    Je suis nouveau sur le forum, mais ça fait longtemps que je suis certains cours sur ce site (je me rappelle encore de l'époque du site du zéro ahah).

    Je dois réaliser un programme en C dans le cadre de mes études, et il y a certains points pour lesquels j'ai besoin de précisions. (D'ailleurs, vaut-il mieux que je fasse plusieurs topic pour chaque question, ou que je les rassemble toutes ici au fur et à mesure qu'elles me viennent ?)

    En gros je dois réaliser un jeu de société en C. On nous demande de laisser le choix à l'utilisateur entre 4 plateaux de jeu. Pour cela, et pour éviter de coder les plateaux directement dans des variables qui prendraient de la place mémoire, j'ai codé les plateaux dans un fichier.txt et je les lis grâce à fopen, fgets, etc... Quand je compile dans code blocks, tout cela fonctionne très bien et j'arrive à lire les plateaux. Mais quand je lance le .exe, il n'arrive pas à trouver les fichiers.txt. Sachant que je dois rendre le projet par internet, je me demande comment fait-on pour gérer les chemins d'accès au fichiers. 

    Voici mon code pour la lecture d'un fichier :

    FILE* fichier = NULL;
    
        fichier = fopen("Plateaux de jeu/Plateau1.txt" , "r"); 
        if(fichier == NULL) 
        {
            printf("Erreur fichier introuvable");
            exit(EXIT_FAILURE);
        }
        rewind(fichier);
        for(i=0; i<DIM_TAB; i++)
        {
    
            for(j=0; j<DIM_TAB; j++)
            {
                c = fgetc(fichier);
                c = c-48;
                plateau1[j][i] = c;
            }
        }
        fclose(fichier);

    Et voici un screen de mon arborescence :

    Voilà pour l'instant c'est les seules questions que j'ai, peut-être que d'autres vont suive ^^.

    Merci pour votre aide ;)

    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2018 à 14:35:50

      Salut,

      Tu peux donner à fopen() le chemin absolu du fichier, ou bien le chemin relatif par rapport au dossier courant du fichier exécutable.

      D'après ton code, il faut que le fichier exécutable soit placé dans le dossier parent de "Plateaux de jeu".

      -
      Edité par Gam' 1 mai 2018 à 15:32:50

      • Partager sur Facebook
      • Partager sur Twitter
        1 mai 2018 à 14:55:03

        C'est ce que j'avais compris oui. Mais puisque je dois transmettre mes fichiers pour le rendu, je peux pas mettre de chemin absolu nan ? Puisque je ne connais pas le dossiers dans lequel mon professeur mettra mes fichiers. Et pour le chemin relatif, c'est à partir d'où ? Il n'y a pas un moyen dans code blocks de régler l'endroit ou se trouve le .exe ?
        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2018 à 15:05:10

          Hello,

          Et si, pour ton prof, tu mettais tout simplement les "data" dans le répertoire de l'exécutable (en modifiant les fopen évidemment) ? Là, normalement, pas de souci (sauf peut-être si exécuté à partir d'un ide, mais comme je n'en emploie pas....)

          -
          Edité par edgarjacobs 1 mai 2018 à 15:05:49

          • Partager sur Facebook
          • Partager sur Twitter

          Il y a ceux qui font des sauvegardes, et ceux qui n'ont pas encore eu d'incident....

            1 mai 2018 à 18:46:18

            edgarjacobs a écrit:

            Hello,

            Et si, pour ton prof, tu mettais tout simplement les "data" dans le répertoire de l'exécutable (en modifiant les fopen évidemment) ? Là, normalement, pas de souci (sauf peut-être si exécuté à partir d'un ide, mais comme je n'en emploie pas....)

            -
            Edité par edgarjacobs il y a environ 3 heures



            Salut ! Donc je dois abandonner mon arborescence et tout mettre dans un seul et même fichier ?

            -
            Edité par Tipounk 1 mai 2018 à 18:47:18

            • Partager sur Facebook
            • Partager sur Twitter
              1 mai 2018 à 18:51:59

              Re,-

              C'est juste une idée, en dépannage. Pas sur qu'elle soit bonne (trop de modif ??). Peut-être un programme d'installation comme inno setup (mais je vais peut-être chercher un peu loin pour un simple exercice).

              • Partager sur Facebook
              • Partager sur Twitter

              Il y a ceux qui font des sauvegardes, et ceux qui n'ont pas encore eu d'incident....

                1 mai 2018 à 19:05:50

                Salut,

                Le chemin relatif, c'est depuis l'exe.

                Généralement, j'ai un dossier "ressources" à côté de mon exe et je met tout dedans.

                Si tu fais un dossier qui contient l'exe et ses ressources, il n'y a pas de raison de les déplacer.

                Bonne continuation.

                • Partager sur Facebook
                • Partager sur Twitter

                Stringman devient Bonhomme !! | Jeux de plateforme : Nouvelle Démo. (màj : 24/04/2021)

                  1 mai 2018 à 19:08:53

                  Ok je vais faire tous ça ! Au pire je ferais un lisez-moi pour le prof :lol: !

                  Merci pour votre aide !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mai 2018 à 2:35:59

                    Bonjour

                    Tout le monde écrit que les chemins relatifs sont résolus depuis le fichier exécutable, mais c'est faux. Les chemins relatifs sont résolus depuis le répertoire de travail courant (current working directory).

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 mai 2018 à 7:24:53

                      Marc Mongenet a écrit:

                      Bonjour

                      Tout le monde écrit que les chemins relatifs sont résolus depuis le fichier exécutable, mais c'est faux. Les chemins relatifs sont résolus depuis le répertoire de travail courant (current working directory).

                      ...qui par défaut est celui de l'exécutable (sous windows au moins....). Mais il a raison quand-même.

                      Sous Windows, tu fais un clic droit/propriétés sur l'exe ou un raccourci y menant. Il s'agît du répertoire qui apparaît au paramètre "démarrer dans :". Par contre, tu n'es maître de cette propriété que pour toi-même. Par exemple si ton répertoire est "mes documents/mon jeu" et que tu fais exécuter dans "program files", il faudra que tes chemins (relatifs) partent de là, mais transférer le dossier de ton jeu à un tiers le remettra automatiquement au dossier de l'exe pour cette personne.

                      Bref, pas besoin de te faire des nœuds au cerveau, tes chemins relatifs sont bons et ton programme fonctionne ? Tu zip le dossier qui contient le tout, tu lui envoies par internet, il dézip, il lance l'exe et ça fonctionnera pareil.

                      Juste faire attention qu'avec code::blocks, l'exécution en "debug" a pour référence le dossier du projet.cbp, le release, lui, part du dossier de l'exe.

                      En théorie, pas un prof n'est assez con ou vicelard pour déplacer les répertoires et/ou changer les répertoires de travail puis se plaindre après que ça ne fonctionne pas. S'il joue avec les dossiers de son Os, il aura des problèmes aussi.

                      Bonne continuation.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Stringman devient Bonhomme !! | Jeux de plateforme : Nouvelle Démo. (màj : 24/04/2021)

                        19 mai 2018 à 19:52:41

                        Désolé pour le temps de réponse, j'avais partiels (ça part sur un 18 en informatique juste parce que j'ai révisé les mallocs la veille :lol: ! )

                        Pour le projet, je dois uniquement rendre les fichiers sources (.c .h et .txt pour les plateaux). Il ne veut pas du .exe. Je pense qu'il comprendra quels sont les fichiers .txt (sachant que ce sont les seuls que j'utilise avec fopen ahah).

                        Une autre question qui n'a rien à voir :

                        J'utilise un sous programme qui affiche mon plateau de jeu dans la console (la SDL c'était trop dur xD ). Pour cela je doit lui transmettre ledit plateau, plus le tableau dynamique contenant les personnages et leurs coordonnées sur le plateau. Dans mon sous programme de 'TEST', il arrive à bien appeler le SP d'affichage. Mais dans mon SP 'tourdujoueur' (qui gère la partie) il n'arrive pas à l’appeler alors que j'ai les mêmes paramètres. Vous pouvez m'expliquer quel est le problème ?

                        Je vous met des le code ici :

                        Code du sous programme 'test' qui fonctionne :

                        #include "main.h"
                        #include "divers.h"
                        
                        void test(S_Joueurs *playerslocal, S_personnages *persolocal, S_donnees donnelocale)
                        {
                            int i;
                            printf("Nb de joueurs : %d\n",donnelocale.nbjoueur);
                            printf("plateau : \n");
                            S_plateau *p = NULL;
                            p = &donnelocale.plateau[0][0];
                            affichageingame(p, persolocal, donnelocale.nbperso);
                            printf("\n\n\n");
                            for(i=0;i<donnelocale.nbjoueur;i++)
                            {
                                printf(" Joueur numero : %d\n", playerslocal[i].numero);
                                printf("        Nom :  "); puts(playerslocal[i].nom); printf("\n");
                                printf("        ID du tueur: %d\n", playerslocal[i].IDtueur);
                                printf("        ID cible 1: %d\n", playerslocal[i].IDcible1);
                                printf("        ID cible 2: %d\n", playerslocal[i].IDcible2);
                                printf("        ID cilbe 3: %d\n", playerslocal[i].IDcible3);
                                printf("\n");
                            }
                        
                            system("pause");
                            return;
                        }
                        

                        Code du SP qui ne fonctionne pas :

                        #include "main.h"
                        #include "divers.h"
                        
                        void tourdujoueur(S_donnees donneeslocales, S_Joueurs *playerslocal, S_personnages *persolocal)
                        {
                            int joueuractif;
                            joueuractif = donneeslocales.IDpremierjoueur;
                            S_plateau *ptrtab=NULL;
                            ptrtab = &donneeslocales.plateau[0][0];
                            //faire boucle while.
                            aquiletour(joueuractif, playerslocal); //Dit qui doit jouer.
                            affichageingame(ptrtab, persolocal, donneeslocales.nbperso);
                            system("PAUSE");
                        
                            return;
                        }
                        

                        Le sous programme que je cherche à appeler est afficheingame(); !

                        Voila merci encore pour votre aide ^^!


                        • Partager sur Facebook
                        • Partager sur Twitter

                        Lecture de fichiers avec fopen

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown