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
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.
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
#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
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.
Bonhomme !! | Jeu de plateforme : Prototype.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent