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

[C] probleme de lecture dans un fichier

mewwwa
mewwwa
Niveau 7
18 janvier 2007 à 22:23:10

Hello,
je veux me faire un petit programme qui lit dans un fichier.
dans le fichier il y a :

ABA
BAB

et je voudrais qu´il transforme les A en 0 et B en 1 et les mettre dans un tableau.
par exemple avec le fichier du dessus je cherche a avoir :
(pour la premiere ligne)
niveau[0][0] = 0
niveau[0][1] = 1
niveau[0][2] = 0

(pour la 2eme ligne)
niveau[1][0] = 1
niveau[1][1] = 0
niveau[1][2] = 1

voila ce que j´ai fait (et qui ne marche pas)

  1. include <stdlib.h>
  2. include <stdio.h>

//constantes

  1. define NB_BLOCS_LARGEUR 3
  2. define NB_BLOCS_HAUTEUR 2

enum {RIEN, MUR, ARBRE, EAU};

int main(int argc, char *argv[])
{
// déclaration des variable et des surface
FILE* fichier = NULL;
char ligneFichier[NB_BLOCS_LARGEUR + 1] = {0}, niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
int i = 0, j = 0;

// ouverture du fichier
fichier = fopen("niv", "r");

// chargement de la zone
for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
{
fgets(ligneFichier, NB_BLOCS_LARGEUR + 1, fichier);

for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
{
switch (ligneFichier[j])
{
case ´A´:
niveau[i][j] = 0;
break;
case ´B´:
niveau[i][j] = 1;
break;
}
}

}
}

ou est le probleme ?
merrci d´av :)

godrik
godrik
Niveau 30
18 janvier 2007 à 23:51:19

tu ne lirais pas les caractere de fin de ligne avec ca ?

en passant:
-ouvre ton fichier en ascii (ca peut te sauver la vie des fois)
-ferme ton fichier en fin de programme

mewwwa
mewwwa
Niveau 7
19 janvier 2007 à 00:21:54

merci pour ta réponses.

-ferme ton fichier en fin de programme
=> je le fait, j´ai l´ai pas mis la pour alléger le code.

-ouvre ton fichier en ascii
=> et comment je fait ca ? ´^^

tu ne lirais pas les caractere de fin de ligne avec ca ?
=> heu bah non, enfin je crois pas.

je vois vraiment pas ou est le problème, et pourtant quand j´affiche le tableau niveau[][], j´ai un truc sans aucun rapport avec mon fichier text... :/

godrik
godrik
Niveau 30
19 janvier 2007 à 00:23:50

ah aussi, dans un switch, on met toujours un default. just in case...

mewwwa
mewwwa
Niveau 7
19 janvier 2007 à 07:12:32

voila le code (avec le default dans le switch, avec une modification des constante (plus de caractere a lire dans le fichier), et avec l´affichage des resulat :

  1. include <stdlib.h>
  2. include <stdio.h>
  1. define NB_BLOCS_LARGEUR 5
  2. define NB_BLOCS_HAUTEUR 3

enum {ZHAUT, ZBAS, ZGAUCHE, ZDROITE, ZAUTRE, ZAUTREO};
enum {RIEN, MUR, ARBRE, EAU};

int main(int argc, char *argv[])
{
// déclaration des variable
FILE* fichier = NULL;
char ligneFichier[NB_BLOCS_LARGEUR + 1] = {0}, niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}, map[5];
int i = 0, j = 0;

// ouverture du fichier
fichier = fopen("niv", "r");

// chargement de la zone
rewind(fichier);
for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++)
{
fgets(ligneFichier, NB_BLOCS_LARGEUR + 1, fichier);

for (j = 0 ; j < NB_BLOCS_LARGEUR; j++)
{
switch (ligneFichier[j])
{
case ´a´:
niveau[i][j] = 0;
break;
case ´b´:
niveau[i][j] = 1;
break;
default:
niveau[i][j] = 3;
}
}

}

printf("%ld%ld%ld%ld%ld ", niveau[0][0], niveau[0][1], niveau[0][2], niveau[0][3], niveau[0][4]);
printf("%ld%ld%ld%ld%ld ", niveau[1][0], niveau[1][1], niveau[1][2], niveau[1][3], niveau[1][4]);
printf("%ld%ld%ld%ld%ld ", niveau[2][0], niveau[2][1], niveau[2][2], niveau[2][3], niveau[2][4]);

}

mon fichier contiens exactement :
aaaaa
bbbbb
ababa

et mon code me donne ca :
00033 33011 11111

avec un autre test :
aabbb
ababa
bbbaa

j´obtien :
00133 33101 0101

(a chaque fois la dernière serie de chiffre correspond a la 2eme ligne de mon fichier... :/)

et je vois toujours pas le problemes...
merci :)

dnob700
dnob700
Niveau 10
19 janvier 2007 à 13:40:27

c´est le default qui coince ici : godrik a raison, gets e renvoie les caractères de fin de ligne (enfin, je crois), ce qui fait que godrik a tort (là, il y a une erreur de logique) car il ne faut pas de default, ou alors, un default qui ne fait rien (ce qui revient au même) car sinon, tu risque d´écrire hors de ton tableau.

donc je serais toi, dans le gets je lirais un ligne plus grande que NB_BLOCS_LARGEUR (au moins un +3 plutôt qu´un +1), dans ce cas là, tupeut ouvrir ton fichier en ascii plutôt qu´en binaire (on ouvre en binaire avec la chaine "rb" dans le fopen) car en binaire, gets pourrait ne pas fonctionner (en vrai, ça ne change rien si tu crée ton fichier sur le même système que le programme, mais soyons propre tout de même), et tu remplit uniquement les NB_BLOCS_LARGEUR première cases de ton tableau, et tu nous montre le résultat (globalement, le changement est de lire un peu plus dans le gets (au moins 3 caractères de plus)).

mewwwa
mewwwa
Niveau 7
19 janvier 2007 à 15:23:59

merci dnob700 pour ta reponse.
en effet tu a raison pour le default !

par contre il y a certaine chause que je n´ai pas compris...
- comment ouvrire un fichier en ascii ?
- a mon code, tu veux juste que je change la taille maximale du fgets ?

alors voila le nouveau code (qui marche toujours pas :/)

  1. include <stdlib.h>
  2. include <stdio.h>
  1. define NB_BLOCS_LARGEUR 5
  2. define NB_BLOCS_HAUTEUR 3

enum {ZHAUT, ZBAS, ZGAUCHE, ZDROITE, ZAUTRE, ZAUTREO};
enum {RIEN, MUR, ARBRE, EAU};

int main(int argc, char *argv[])
{
// déclaration des variable et des surface
FILE* fichier = NULL;
char ligneFichier[NB_BLOCS_LARGEUR + 3] = {0}, niveau[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0}, map[5];
int i = 0, j = 0;

// ouverture du fichier
fichier = fopen("niv", "r");

// chargement de la zone
rewind(fichier);
for (i = 0 ; i < NB_BLOCS_HAUTEUR; i++)
{
fgets(ligneFichier, NB_BLOCS_LARGEUR + 3, fichier);
// fseek(fichier, 3, SEEK_CUR);
for (j = 0 ; j < NB_BLOCS_LARGEUR; j++)
{
switch (ligneFichier[j])
{
case ´a´:
niveau[i][j] = 0;
break;
case ´b´:
niveau[i][j] = 1;
break;
//case ´ ´:
// niveau[i][j] = 2;
//break;
}
}

}
printf("%ld%ld%ld%ld%ld ", niveau[0][0], niveau[0][1], niveau[0][2], niveau[0][3], niveau[0][4]);
printf("%ld%ld%ld%ld%ld ", niveau[1][0], niveau[1][1], niveau[1][2], niveau[1][3], niveau[1][4]);
printf("%ld%ld%ld%ld%ld ", niveau[2][0], niveau[2][1], niveau[2][2], niveau[2][3], niveau[2][4]);

}

voil

mewwwa
mewwwa
Niveau 7
19 janvier 2007 à 15:26:38

voila le contenu de niv :
aabbb
ababa
bbbaa
(sans aucun espace)
ce que le code devrais afficher :
00111 01010 11100
et se qu´il m´affiche...
00101 01011 11100
(encore une fois le ´11100´ correspond a la 3eme ligne du tableau.

je n´arrive vraiment pas a voir d´ou viens le probleme.... :s

godrik
godrik
Niveau 30
19 janvier 2007 à 15:41:49

je ne comprends pas bien mais utilise fscanf.
Il découpera par mot et ne devrais donc pas poser probleme.

dnob700
dnob700
Niveau 10
19 janvier 2007 à 16:24:18

j´ai trouvé !

l´erreur est dans la déclaration du tableau niveau : tu inverse les indices (tu fait niveau[largeur][hauteur] au lieu de faire niveau[hauteur][largeur]) moralité, la tableau fait la bonne taille en tout, donc il n´y a pas d´erreur en lecture, mais tu ne remplit pas les cases que tu croit remplir.

C´est sur ce genre d´erreur (sur lesquelles on peut perdre pas mal de temps quand même) qu´on s´aperçoit de l´intérêt de langage comme Caml qui vérifie l´accès au tableau (mais on peut lui demander de ne pas le faire en release, pour gagner du temps).

mewwwa
mewwwa
Niveau 7
19 janvier 2007 à 16:40:26

OMG en effet !
c´est tellement stupide.. >.<

merci bcp a toi ! :D

godrik
godrik
Niveau 30
19 janvier 2007 à 16:46:40

En fait, les gens utilisent des classes qui gerent ca de facon transparente en C++. Mais je suis d´accord que ca aide les débutants... :)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment