IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Extraire donnés d'un fichier, afficher images


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Points : 21
    Points
    21
    Par défaut Extraire donnés d'un fichier, afficher images
    Bonsoir à tous,

    Je viens de faire un code qui fait les actions suivantes :

    - ouvrir le fichier niveau1.txt qui comporte 25 caractères sur une ligne et 19 caractères sur une colonne
    - chaque "x" dans le fichier correspond à une image à afficher
    - on parcourt le tableau des caractères du fichier (x = 1 et tout autre caractère = 0) pour savoir où afficher les images, sachant que ces images ont une dimension de 25*25 pixels

    Le code que je vais donner affiche bien les images, mais au mauvais endroit. Il y a également une image qu'il devrait afficher qu'il n'affiche pas. Je vais également vous fournir le fichier où j'extrais les caractères. Vous verrez que quelques problèmes surviennent (comme par exemple le haut et le bas sont inversés).

    Code C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #define LARGEUR 625
    #define HAUTEUR	475
     
    int main(int argc, char *argv[]){
     
    	SDL_Surface *ecran = NULL, *image = NULL;
     
    	FILE *fichier = NULL; 
    	int j = 0, i = 0,l = 0, continuer = 1;
    	char chaine[500] = ""; 
    	int tabDecor[25][19] = {0};
    	fichier = fopen ("niveaux/niveau1.txt", "r"); 
     
    	SDL_Init(SDL_INIT_VIDEO); 
    	ecran = SDL_SetVideoMode(LARGEUR, HAUTEUR, 32, SDL_HWSURFACE); 
    	image = IMG_Load("images/brique.png"); 
     
    	if (image == NULL)
    		printf("ERREUR OUVERTURE IMAGE");
     
     
    	if ( fichier == NULL ) 
    		exit (EXIT_FAILURE); 
     
    	while ( fgets(chaine, 500, fichier) != NULL ){
    		l++;
    		for ( i = 0; i < 25 ; i++ ) {
    			if ( chaine[i] == 'x' ) {
    				tabDecor[i][l] = 1; 
    			} else {
    				tabDecor[i][l] = 0; 
    			}
    		}
    	}
     
    	fclose(fichier);
     
    	SDL_Rect positionBrique; 
     
    	i = 0;
    	j = 0;
     
    	SDL_WM_SetCaption("PolyBros", NULL);
     
    	for ( i = 0; i < 25 ; i++ ) {
    		for ( j = 0 ; j < 19 ; j++ ) {
     
    			if ( tabDecor[i][j] == 1 ) {
    				positionBrique.x = 25 * i;
    				positionBrique.y = 25 * j;
     
    				SDL_BlitSurface(image, NULL, ecran, &positionBrique); 
    			}
    		}
    		SDL_Flip(ecran);
    	}
     
     
     
    	while (continuer) {
    		SDL_Event event;
    		SDL_WaitEvent(&event); 
    		switch(event.type) {
    			case SDL_QUIT :
    				continuer = 0; 
    				break;
    		}
    	}
     
    	SDL_FreeSurface(image);
    	SDL_Quit();
     
    	return EXIT_SUCCESS; 
    }
    Fichier source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxx
    _xxxxxxxxxxxxxxxxxxxxx_xx
    Résultat :


    Comme vous le remarquez sûrement, il y a une incohérence entre le fichier source et le résultat final.
    Seulement, je n'arrive pas à corriger cette erreur. Donc si l'un d'entre vous la voit, votre aide serait la bienvenue.

    Bonne soirée et merci d'avance !

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Je ne comprends pas comment ta boucle fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	while ( fgets(chaine, 500, fichier) != NULL ){
    		l++;
    		for ( i = 0; i < 25 ; i++ ) {
    			if ( chaine[i] == 'x' ) {
    				tabDecor[i][l] = 1; 
    			} else {
    				tabDecor[i][l] = 0; 
    			}
    		}
    	}
    Essaye d'afficher ton tableau à la fin pour voir si le résultat est le même que dans ton fichier (avec des 1 à la place des x et des 0 sinon). Si ce n'est pas le même, alors le problème vient de la boucle.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier = fopen ("niveaux/niveau1.txt", "r");
    Il faudrait vérifier si fopen retourne bien un pointeur valide (s'il trouve bien le fichier).
    En fait, vous le faites trop tard. Je m'explique, si le fichier n'est pas trouvé, vous allez tout de même démarrer SDL, charger une image, mais en cas d'erreur, vous ne fermez rien. Du coup, il y a perte des ressources allouées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ( i = 0; i < 25 ; i++ ) {
    			if ( chaine[i] == 'x' ) {
    				tabDecor[i][l] = 1; 
    			} else {
    				tabDecor[i][l] = 0; 
    			}
    		}
    Au lieu d'utiliser 25 en valeur dure, vous pouvez tenter un strlen(chaine).

    Votre problème actuel (disons, au moins une erreur),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while ( fgets(chaine, 500, fichier) != NULL ){
    		l++;
    		for ( i = 0; i < 25 ; i++ ) {
    			if ( chaine[i] == 'x' ) {
    				tabDecor[i][l] = 1; 
    			} else {
    				tabDecor[i][l] = 0; 
    			}
    		}
    	}
    c'est le l++. Il est fait au début. Et donc, 'l' sera égal à 1, pour le premier passage.

    Il n'est pas nécessaire de faire le SDL_Flip() dans la boucle d'affichage. Il suffira de le faire une fois en dehors de la boucle.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier = fopen ("niveaux/niveau1.txt", "r");
    Il faudrait vérifier si fopen retourne bien un pointeur valide (s'il trouve bien le fichier).
    En fait, vous le faites trop tard. Je m'explique, si le fichier n'est pas trouvé, vous allez tout de même démarrer SDL, charger une image, mais en cas d'erreur, vous ne fermez rien. Du coup, il y a perte des ressources allouées.
    Je fais bien la vérification, peut-être tard certes mais le fichier est bien ouvert puisque que je change le fichier source, des changements sont visibles dans le résultats final...

    Citation Envoyé par LittleWhite Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for ( i = 0; i < 25 ; i++ ) {
    			if ( chaine[i] == 'x' ) {
    				tabDecor[i][l] = 1; 
    			} else {
    				tabDecor[i][l] = 0; 
    			}
    		}
    Au lieu d'utiliser 25 en valeur dure, vous pouvez tenter un strlen(chaine).

    Votre problème actuel (disons, au moins une erreur),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while ( fgets(chaine, 500, fichier) != NULL ){
    		l++;
    		for ( i = 0; i < 25 ; i++ ) {
    			if ( chaine[i] == 'x' ) {
    				tabDecor[i][l] = 1; 
    			} else {
    				tabDecor[i][l] = 0; 
    			}
    		}
    	}
    c'est le l++. Il est fait au début. Et donc, 'l' sera égal à 1, pour le premier passage.
    OK, je note, je testerai ça.

    Citation Envoyé par LittleWhite Voir le message
    Il n'est pas nécessaire de faire le SDL_Flip() dans la boucle d'affichage. Il suffira de le faire une fois en dehors de la boucle.
    Justement, je n'avais pas mis le SDL_Flip(); dans la boucle auparavant, je l'avais mis après. Seulement, les images ne s'affichaient pas directement ; il fallait réduire la fenêtre du programme puis la rouvrir pour que les images s'affichent.

    En tout cas merci pour vos réponses, je teste ça dans la matinée et vous tient au courant !

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Pour le fichier, oui, certes, aujourd'hui vous l'ouvrez et tout va bien. Par contre, le jour où cela n'est pas le cas, alors, vous avez un problème.
    De plus, il faut avoir de bonnes pratiques rapidement, pour programmer correctement, tout le temps (et ne pas prendre de mauvaises habitudes).

    Pour le SDL_Flip, je ne sais pas, je trouve cela un peu bizarre, mais bon.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le SDL_Flip devrait être fait après et une seule fois vue que l'affichage ne change jamais après.
    Mais à défaut, il conviendrait de le faire dans la boucle d'affichage, et non la boucle de chargement.

    Cdt
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. [XL-2007] Extraire données de plusieur fichiers .xls selectionné via un dossier
    Par wisemanvsfatboy dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/05/2009, 16h34
  2. Réponses: 0
    Dernier message: 02/04/2009, 13h10
  3. Extraire données d'un fichier .csv
    Par cre31400 dans le forum Débuter
    Réponses: 4
    Dernier message: 02/07/2008, 19h39
  4. extraire données d'un fichier texte
    Par julien0000 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/07/2008, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo