Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplir un tableau à partir d'un fichier

13 avril 2017 à 19:13:35

Bonjour/Bonsoir,

Je dois avec cette fonction mettre tous les mots de mon fichier dans un tableau alloué dynamiquement. JE me suis aidé dans de internet pour savoir comment parcourir le fichier. Or voilà. Lors de l'affichage du tableau par la suite, ça écrit bien les mots qui sont dans le fichier mais j'ai deux problèmes: 

1) Des fois (pas tout le temps) le programme crash mais jamais au même endrot

2) A l'affichage, après certains mots, il y a des caractères en plus qui apparaissent

Voici mon code et je ne sais pas du tout d'où vient l'erreur.

char **load_lexicon(char *filename)

{

    int nbrmot = lexicon_size(&filename);//calcul le nombre de mot du fichier

    filename = fopen("francais.dict", "r");

    char chaine[TAILLE_MAX];//taille de chaine max

    int nblettre = 0;

    char **tab = NULL;

    int i = 0;

    int y;

    tab = (char**) malloc(nbrmot * sizeof(char*));

    if(filename != NULL)

    {

        while(fgets(chaine, TAILLE_MAX, filename) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)

        {

            nblettre = longueurChaineCaractere(chaine);//calcul le nombre de lettre dans une chaine

            nblettre = nblettre - 1;

            tab[i] = creerTab1D(nblettre);

            for(y = 0 ; y <= nblettre-1 ; y++)

            {

                tab[i][y] = chaine[y];

            }

            i = i + 1;

        }

        fclose(filename);

    }

    return tab;

}



Merci d'avance pour votre aide.

-
Edité par Lamouette2.0 13 avril 2017 à 21:17:18

  • Partager sur Facebook
  • Partager sur Twitter
13 avril 2017 à 19:57:03

Bonjour,

Tu devrais mettre ton code entre les balises </> (voir bouton : </> , édite ton message, ça sera mieux pour lire ton code. Sinon, selon l'IDE tu as un debugger de disponible qui te surlignera la ligne d'instruction fautive (tes erreurs dont tu nous parle). Quel IDE as-tu ?

Sinon, quelques remarques:

Dans l' header <string.h> , tu as la fonction strlen() qui renvoie le nombre de caractères d'un tableau de char.

Pour le for(y = 0 ; y <= nblettre - 1 ; y++) , si tu as une option de compilation récente comme std=c11 ou std=c99 tu peux faire : " for(unsigned int y = 0 ; y < nblettre - 1 ; y++) "

D'ailleus dans ce for la ligne suivante serait plus judicieuse je pense :

for( unsigned int y = 0 ; y < nblettre - 1 ; y++)

Car avec le for que tu as ecrit, tu écris sur la caractère '\0' qui détermine la fin de chaîne de caractère, donc le programme ne trouve pas la fin du tableau... et rajoute à la fin de ces mots les données qui suivent le tableau de char : ta fameuse erreur de lettres qui se rajoutent

-
Edité par Warren79 13 avril 2017 à 21:42:04

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

13 avril 2017 à 22:01:48

Je travaille avec l'IDE Code::Blocks.

Mais je n'arrive pas à rajouter les compilateur malgré ce que je trouve sur internet. du coup je n'arrive pas à exécuter la ligne for.

Merci

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
13 avril 2017 à 22:14:51

char **load_lexicon(char *filename)
{
...
filename = fopen("francais.dict", "r");
...
}

Ca passe le niveau de la compilation ça ? o_O
  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2017 à 10:35:43

Oui parfaitement, je l'ai même essayer dans un autre programme pour voir si ça fonctionnait et ça fonctionne.
  • Partager sur Facebook
  • Partager sur Twitter
14 avril 2017 à 10:54:39

Kefka1988 a écrit:

char **load_lexicon(char *filename)
{
...
filename = fopen("francais.dict", "r");
...
}


Ca passe le niveau de la compilation ça ? o_O

Ah oui, j'avais pas fait gaffe ! :-° ...

@Lamouette20. : la fonction  fopen() renvoie l'adresse d'une structure FILE. Normalement, ton programme ne devrait pas compiler, puisque tu lui assigne (à fopen) un pointeur sur char (= un tableau de char). Sinon pour le malloc à la ligne 19, ça ne sert à rien de caster malloc , c'est même déconseillé (cast = conversion d'un type vers un autre) , donc : tab = malloc(nbrmot * sizeof(char*));

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

14 avril 2017 à 11:06:11

Merci pour tous vos conseils, grâce à vous j'ai résolu les problèmes et il y en avait un  autre.

tab[i] = creerTab1D(nblettre);

C'est ma fonction creerTab1D qui écrasait le marqueur de fin du coup je l'ai remplacé par

tab[i] = malloc(nblettre * sizeof(char));

et maintenant j'ai le résultat attendu. 

Merci !

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
14 avril 2017 à 12:24:52

N'oublies pas de libérer la mémoire à la fin du programme, par exemple.  Vu que c'est un tableau en 2D, tu dois connaître le nombre d'éléments (les mots), pour libérer un à un les éléments de la dim2, puis libérer le tableau en dim1.

  • Partager sur Facebook
  • Partager sur Twitter
2 avril 2022 à 15:09:49 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


2 avril 2022 à 15:35:33

Créés ton propre sujet, au lieu de déterrer les viex sujets et utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).
  • Partager sur Facebook
  • Partager sur Twitter
...
2 avril 2022 à 16:06:25

@MEROUANEMERIEM Bonjour, merci de ne pas déterrer d'ancien sujet. Créer le votre dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (un bonjour ou des salutations à la communauté et se termine par des remerciements par avance pour les futures réponses) un descriptif de votre problème et le code que vous avez écrit inséré sur le forum avec l'outil d'intégration de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter