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 :

Tableau de pointeur char/tableau char 2D


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Tableau de pointeur char/tableau char 2D
    Bonjour, désolé si mon problème vous semblera d'une simplicité extrême a résoudre mais malgré des heures de recherches sur google, aucune réponse n'a pu me sortir de mon problème.
    Alors voilà, dans le cadre d'un gros programme (3000 lignes actuellement dans 8 fichiers et c'est loin d'être fini) j'ai une quarantaine de variable à extraire de fichiers, jusque là, ça va, fopen fonctionne mais pour l'injecter dans des char, j'ai au début créé 40 variable sauf que ça me semblait illisible et un cauchemars algorithmique. J'ai donc voulu créer un tableau de char 2D me permettant de regrouper toute ces variables en un seul tableau et ainsi me simplifier la vie lors du traitement de ces donnés. Le problème est que j'obtenais des erreurs lorsque, dans le fopen, j'indiquais la ligne ou il devais écrire dans le tableau (le compilateur voulais que je lui remplisse les deux champ entre crochet alors que je ne voulais lui donner que la ligne d'écriture ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char nomArme[20][10]
    fscanf(arme, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneArme, nomArme[][0], nomArme[][1], nomArme[][2], nomArme[][3], nomArme[][4], nomArme[][5], nomArme[][6], nomArme[][7], nomArme[][8], nomArme[][9]);
    Ce problème m'emmerdant, j'ai fini par choisir de créer un tableau de pointeur de type char emmenant aux 40 variables. Là aussi les problèmes s’abattent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fsanf:
    fscanf(arme, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneArme, *nomArme[0], *nomArme[1], *nomArme[2], *nomArme[3], *nomArme[4], *nomArme[5], *nomArme[6], *nomArme[7], *nomArme[8], *nomArme[9]);
     
    Injection dans le tableau des char:
    *nomArme[0] = arme1;
    *nomArme[1] = arme2;
    *nomArme[2] = arme3;
    *nomArme[3] = arme4;
    *nomArme[4] = arme5;
    *nomArme[5] = arme6;
    *nomArme[6] = arme7;
    *nomArme[7] = arme8;
    *nomArme[8] = arme9;
    *nomArme[9] = arme10;
    Si vous voyez tout de suite un erreur, merci de me le signaler, si vous avez besoin de plus de code, pas de problème...

    Merci d'avance de m'aider car mon projet est bloqué tant que ce bug n'est pas résolu (intestable car le code s’exécute très tôt)...

  2. #2
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    1. fscanf a besoin d'une adresse. Pour une chaine de caractère, son nom suivi de son indice suffit.
    2. Je te conseil vivement de tester le retour du fscanf, car s'il y a une erreur de lecture, tu ne pourras savoir si une chaîne a été correctement renseignée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char nomArme[20][10] ; // 20 chaînes de 9 caractères max.
    int ret = 0 ;
    ret = fscanf(arme, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneArme, nomArme[0], nomArme[1], nomArme[2], nomArme[3], &nomArme[4], nomArme[5], nomArme[6], nomArme[7], &nomArme[8], nomArme[9]);
    if(ret!=10)
        printf("Erreur\n") ;
    else {
        printf("Code début de ligne = %d\n", debutLigneArme) ;
        for(i=0; i<10; i++)
            printf("\tnomArme[%d] = %s\n",i, nomArme[i]) ;
    }
    [edit] Avec le format "%s" dans fscanf, cette dernière s'arrête sur un espace. En gros, si tes chaînes comportent des espaces, il te faut revoir le format. voir man fscanf.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    C'est de l'exploitation de BDD donc si l'entrée pose problème, c'est que quelqu'un y a touché
    Pour les espaces, il n'y en a que en temps que séparateur dans la BDD et un algorithme les régénère derrière pour que ça soit plus lisible pour l'utilisateur.

    Cela a résolu mon problème, merci beaucoup =)

  4. #4
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par Taiki
    C'est de l'exploitation de BDD donc l'entrée pose problème, c'est que quelqu'un y a touché
    Tu n'avais pas mis d'exemple du fichier. Donc on ne pouvait pas "deviner"


    Pense au bouton
    Bonne journée
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    En effet ^^
    Merci encore

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Utilise une boucle pour ta saisie:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int charger_noms_arme(FILE *fp, char nomArme[][20], size_t nb_armes)
    {
        int err = 0;
     
        if (fp != NULL && nomArme != NULL)
        {
            int debutLigneArme;
     
            if (1 == fscanf(fp, "%d", &debutLigneArme))
            {
                int i;
                int c;
     
                for (i = 0; i < nb_armes && err == 0; i++)
                {
                    if (1 != fscanf(fp, "%19s", nomArme[i]))
                    {
                        err = 1;
                    }
                }
     
                while ((c = fgetc(fp)) != '\n' && c != EOF)
                {
                    /* Ne fait rien sinon consommer les caracteres qui restent
                       sur la ligne courante */
                }
            }
            else
            {
                err = 1;
            }
        }
        else
        {
            err = 1;
        }
     
        return err;
    }
     
    int main(void)
    {
        int err = 0;
        char nomArme[10][20] = {""};
        FILE *arme = NULL;
     
        arme = fopen("test.txt", "r");
        if (arme != NULL)
        {
            if (0 == charger_noms_arme(arme, nomArme, 10))
            {
                int i;
     
                for (i = 0; i < 10; i++)
                {
                    printf("ARME %d: %s\n", i+1, nomArme[i]);
                }
            }
     
            fclose(arme), arme = NULL;
        }
        else
        {
            err = EXIT_FAILURE;
        }
     
        return err;
    }
    Comme cela, si le nombre d'armes change, tu n'a pas à modifier tes appels èà fscanf().

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    En fait, le code est bien plus complexe que ce que j'ai affiché ici, voilà toute la partie d'exploitation du fichier(j'ai des variable extern donc toute les variables ne sont pas visibles ici)
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    void intNomEquipement(int ville)
    {
        int failOuverture = 0, debutLigneArme = 0, debutLigneArmure = 0, debutLigneGant = 0, debutLigneBotte = 0, i = 0, j = 0;
        ville++;
     
        /*On commence à ouvrir le fichier arme.dat -> la BDD d'arme*/
     
        FILE* arme = NULL;
        FILE* armure = NULL;
        FILE* gant = NULL;
        FILE* botte = NULL;
        arme = fopen("Arme.dat", "r");
        armure = fopen("Armure.dat", "r");
        gant = fopen("Gant.dat", "r");
        botte = fopen("Botte.dat", "r");
     
        #ifdef DEV
        printf("Arme: %d\n", arme);
        printf("Armure: %d\n", armure);
        printf("Gant: %d\n", gant);
        printf("Botte: %d\n", botte);
        #endif
     
        if (arme != NULL && armure != NULL && gant != NULL && botte != NULL) //Si tous les fichier s'est correctement ouvert
        {
            do
            {
                fscanf(arme, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneArme, nomArme[0], nomArme[1], nomArme[2], nomArme[3], nomArme[4], nomArme[5], nomArme[6], nomArme[7], nomArme[8], nomArme[9]);
                #ifdef DEV
                printf("Arme: OK\n");
                #endif
                fscanf(armure, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneArmure, nomArmure[0], nomArmure[1], nomArmure[2], nomArmure[3], nomArmure[4], nomArmure[5], nomArmure[6], nomArmure[7], nomArmure[8], nomArmure[9]);
                #ifdef DEV
                printf("Armure: OK\n");
                #endif
                fscanf(gant, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneGant, nomGant[0], nomGant[1], nomGant[2], nomGant[3], nomGant[4], nomGant[5], nomGant[6], nomGant[7], nomGant[8], nomGant[9]);
                #ifdef DEV
                printf("Gant: OK\n");
                #endif
                fscanf(botte, "%d %s %s %s %s %s %s %s %s %s %s\n", &debutLigneBotte, nomBotte[0], nomBotte[1], nomBotte[2], nomBotte[3], nomBotte[4], nomBotte[5], nomBotte[6], nomBotte[7], nomBotte[8], nomBotte[9]);
                #ifdef DEV
                printf("Botte: OK\n");
                #endif
                if (debutLigneArme >= 4 || debutLigneArmure >= 4 || debutLigneGant >= 4 || debutLigneBotte >= 4)
                {
                    fseek(arme, 0, SEEK_SET);
                    fseek(armure, 0, SEEK_SET);
                    fseek(gant, 0, SEEK_SET);
                    fseek(botte, 0, SEEK_SET);
                }
            } while (debutLigneArme != ville);
            fclose(arme);//On ferme le fichier une fois qu'on a fini.
        }
     
        else
        {
            failOuverture++;
        }
     
        if(failOuverture != 0) //Si l'ouverture a foirée
        {
            printf("Le chargement des fichier n'a pas fonctionne.\nVeillez contacter le developpeur\n");
            exit(-1); //Si l'ouverture a foirée, on quitte le programme
        }
     
        /*On va mettre des espaces dans les noms des armes à la place de _*/
     
        for(i = 0; i < 10; i++)
        {
            for(j = 0; j < 20; j++)
            {
                if (nomArme[i][j] == '_')
                {
                    nomArme[i][j] = ' ';
                }
                else if (nomArme[i][j] == '\0')
                {
                    j = 20;
                }
            }
     
            for(j = 0; j < 20; j++)
            {
                if (nomArmure[i][j] == '_')
                {
                    nomArmure[i][j] = ' ';
                }
                else if (nomArmure[i][j] == '\0')
                {
                    j = 20;
                }
            }
     
            for(j = 0; j < 20; j++)
            {
                if (nomGant[i][j] == '_')
                {
                    nomGant[i][j] = ' ';
                }
                else if (nomGant[i][j] == '\0')
                {
                    j = 20;
                }
            }
     
            for(j = 0; j < 20; j++)
            {
                if (nomBotte[i][j] == '_')
                {
                    nomBotte[i][j] = ' ';
                }
                else if (nomBotte[i][j] == '\0')
                {
                    j = 20;
                }
            }
        }
    }
    Je n'ai pas encore tout commenté ni optimisé l'algorithme mais ça viendra =)

    Sinon, existe-t-il une façon simple d'aller au debut de la ligne suivante d'un fichier sans fseek(fichier, xxxxxxxx, SEEK_CURRENT)? Mettre \n a la fin de la ligne formaté fais bien cela?

    Merci d'avance pour votre aide

  8. #8
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Citation Envoyé par Taiki
    Sinon, existe-t-il une façon simple d'aller au debut de la ligne suivante d'un fichier sans fseek(fichier, xxxxxxxx, SEEK_CURRENT)? Mettre \n a la fin de la ligne formaté fais bien cela?
    Thierry Chappuis t'as donné la réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ((c = fgetc(fp)) != '\n' && c != EOF)
    {
        /* 
             Ne fait rien sinon consommer les caracteres qui restent
             sur la ligne courante.
          */
    }
    Effectivement ton code peut-être factorisé par quelques boucles. Au niveau de l'ouverture des fichiers, ainsi que la lecture.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup à vous tous pour votre aide extrêmement précieuse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 07/07/2008, 11h43
  2. Tableau dynamique de pointeurs sur const char*
    Par Le Mérovingien dans le forum Débuter
    Réponses: 6
    Dernier message: 05/06/2008, 14h23
  3. pointeur vers tableau de pointeurs
    Par Michel_57 dans le forum C++
    Réponses: 6
    Dernier message: 09/11/2007, 21h41
  4. Allocation dynamique: Tableau de pointeur sur char
    Par Anonymouse dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2007, 10h57
  5. [Debutant]Tableau de pointeur char (char *)
    Par nephhh dans le forum Débuter
    Réponses: 8
    Dernier message: 03/11/2006, 00h48

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