Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplir une matrice sur base d'un fichier .txt

    17 février 2018 à 12:36:10

    Bonjour à tous,

    Dans le cadre d'un projet, je dois remplir une matrice (qui sera en vérité une map de jeu) à partir d'un fichier .txt.

    Je m'explique, mettons une matrice "char map[MAX][MAX]" qui doit se remplir correctement sur base d'un fichier .txt qui se compose comme suit :

    11111

    10001

    10001

    10001

    11111

    Ceci est un exemple arbitraire.  Et je dois donc remplir ma matrice sur base de ce fichier .txt.

    Voici le code auquel j'avais pensé, et qui évidemment ne fonctionne absolument pas.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 5
    
    void load_map (char map[MAX][MAX]){
    	FILE * fichier = NULL;
    	fichier = fopen ("oc.txt", "r");
    	int actual_nb = 0;
    	int i;
    	int j;
    
    	if (fichier != NULL){
    		do{
    			for (i = 0; i < MAX; i++){
    				printf("\n");
    				for (j = 0; j < MAX; j++){
    					actual_nb = fgetc (fichier);
    					
    					if (actual_nb != EOF)
    						map [i][j] = actual_nb;
    						
    				}
    					
    			}
    		}while (!feof(fichier));
    	}
    
    	else
    		printf("Le fichier n'a pas pu etre ouvert !\n");
    
    }
    
    void show_map(char map[MAX][MAX]){
    	int i; 
    	int j;
    	for (i = 0; i < MAX; i++){
    		printf("\n");
    		for (j = 0; j < MAX; j++){
    			printf("%c\n", map[i][j]);
    		}
    	}
    }
    
    int main(int argc, char const *argv[])
    {
    	char map[MAX][MAX];
    	load_map(map);
    	show_map(map);
    
    	return 0;
    }

    Je lis pourtant caractère par caractère et les stocke donc un par un dans la bonne cellule de la matrice.  Il doit y avoir un souci avec fgetc lors d'un passage à la ligne dans le fichier.txt pour continuer à fonctionner correctement, je ne vois pas vraiment d'autre explication.

    Si quelqu'un comprend et souhaite m'éclairer je ne dis pas non !  Merci d'avance à tous.

    PS : J'ai essayé ceci aussi, mais ça ne m'affiche rien et le programme tourne à l'infini... 

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 1000
    #define TAILLE 5
    
    void load_map (char map[TAILLE][TAILLE]){
    	FILE * fichier = NULL;
    	fichier = fopen ("oc.txt", "r");
    	char ligne[MAX];
    	
    	int i;
    	int j;
    
    	if (fichier != NULL){
    		for (i = 0; i < TAILLE; i++){
    			fgets (ligne, MAX, fichier);
    			j = 0;
    			do{
    				map[i][j] = ligne[j];
    			}while (ligne[j] != '\n');
    					
    		}
    	}
    
    	else
    		printf("Le fichier n'a pas pu etre ouvert !\n");
    
    }
    
    void show_map(char map[TAILLE][TAILLE]){
    	int i; 
    	int j;
    	for (i = 0; i < TAILLE; i++){
    		printf("\n");
    		for (j = 0; j < TAILLE; j++){
    			printf("%c\n", map[i][j]);
    		}
    	}
    }
    
    int main(int argc, char const *argv[])
    {
    	char map[TAILLE][TAILLE];
    	load_map(map);
    	show_map(map);
    
    	return 0;
    }
    
    




    -
    Edité par MaximeJeanpierre 17 février 2018 à 13:55:42

    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2018 à 12:58:13

      Salut,

      Ce sont les caractères de fin de ligne qui te mettent dans le caca. Quand un fichier contient des données qui ne sont pas destinées à être lues par un humain, on utilise le mode binaire pour les fichier, cela permet de garder le contrôle plus facilement sur le contenu.

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        17 février 2018 à 13:09:15

        Salut,

        C'est toi qui a formaté le fichier texte de cette façon ?

        Comment ces données ont-elles été écrites dans le fichier texte ?

        -
        Edité par magma 17 février 2018 à 13:10:36

        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2018 à 13:53:13

          Je l'ai écrit manuellement dans le fichier.
          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2018 à 14:09:14

            Hello,

            Où incrémentes-tu j dans le do...while ligne 19-21 du second code ? Car cela corrigé, le code devrait fonctionner, à condition que le nombre de caractères d'une ligne soit<=TAILLE. Tu devrais modifier le test ligne 21 en ajoutant cette condition.

            EDIT: ta fonction load_map() devrait renvoyer quelque chose pour indiquer si la map a bien été remplie, car ici, que le fichier ait pu être ouvert ou non, tu appelles show_map()

            -
            Edité par edgarjacobs 17 février 2018 à 14:14:06

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              17 février 2018 à 14:18:29

              Teste cet exemple

              ...

              map2d.txt

              11111
              10001
              10001
              10001
              11111


              test.c

              #include <stdio.h>
              
              #define MAX 5
              
              int main(void)
              {
                int i, j, c, map2d[MAX][MAX];
                FILE *f = fopen("map2d.txt", "r");
              
                if(!f) return 1;
              
                //Lecture
                for(i = 0; i < MAX; ++i){
                  for(j = 0; j < MAX + 1; ++j){
                    if((c = fgetc(f)) != EOF && c != '\n'){
                      map2d[i][j] = c - '0';
                    }
                  }
                }
              
                //Affichage
                for(i = 0; i < MAX; ++i){
                  for(j = 0; j < MAX; ++j){
                    printf("%d", map2d[i][j]);
                  }
                  putchar('\n');
                }
              
                fclose(f);
                return 0;
              }

              ...

              -
              Edité par magma 18 février 2018 à 12:37:34

              • Partager sur Facebook
              • Partager sur Twitter

              Remplir une matrice sur base d'un fichier .txt

              × 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