begin process at 2012 05 29 13:20:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

mettre un fichier texte dans un tableau en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

mettre un fichier texte dans un tableau en C

mardi 1 novembre 2011 à 03:29:14 | mettre un fichier texte dans un tableau en C

snake57

Bonjour à tous, je me suis fais 3 petite fonction.

La première me permet de récupérer le nombre de ligne dans un fichier texte.
La seconde me renvoie un tableau qui contient dans sa dimension 0 le nombre de ligne du fichier texte et dans les dimensions suivantes le nombre de caractère de chaque ligne. Par ex si la dimension 3 vaut 18, cela signifie que la ligne 3 du fichier a 18 caractères.

Ces deux fonctions marchent parfaitement.

Je me suis alors fais une troisième fonction qui range dans un tableau le fichier texte.
C'est la que j'ai un soucis. J'ai ma compilation qui passe sans problème mais à l'exécution j'ai une erreur "segmentation fault". Je pense donc que je tape dans une zone mémoire non autorisée ou un truc du genre. Mais ça fait 3 jours que je cherche et j'arrive pas a mettre la main sur l'erreur que j'ai pu faire.

Je vous laisse ci-dessous mes 3 fonctions, J'ai mis plein de commentaires donc vous devriez vite comprendre le principe du truc.

Si quelqu'un à le temps d'essayer ma 3è fonction se serait cool. Parce que la je bloque vraiment la dessus.

merci

Code C/C++ :
#include <stdio.h>
#include <stdlib.h>

#include "fichier.h"

//***********************************************************************************************************************************//
//Fonction permettant de calculer le nombre de ligne d'un fichier                                                                    //
//Elle prend comme paramètre le chemin d'acces vers ce fichier sous la forme d'une chaine de caractères                              //
//Elle renvoie un entier qui contient le nombre de ligne qu'il y'a dans le fichier                                                   //
//***********************************************************************************************************************************//
long nbrLigneFichier(char *chemin)
{
    FILE *fichier = NULL;               //fichier est un pointeur vers une structure de type FILE
    char caractereActuel = 'a';         //contient le caractère actuellement lu par la fonction
    long nbrLigne = 0;                  //contient le nombre de ligne du fichier
    
    fichier = fopen(chemin, "r");       //on ouvre le fichier
    if (fichier == NULL)                //si l'ouverture échoue
    {
        printf("Impossible d'ouvrir le fichier %s",chemin); //on affiche un message d'erreur
        exit(0);                        //on quitte le programme
    }
    while (caractereActuel != EOF)      //on continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    {
        caractereActuel=fgetc(fichier); //lecture du fichier caractère par caractère
        if(caractereActuel=='\n')       //on compte le nombre de ligne (les caractères retour à la ligne)
        {
            nbrLigne++;                 //incrémentation du compteur de ligne
        }
    }
    fclose(fichier);                    //on referme le fichier
    return(nbrLigne);                   //la fonction renvoie le nombre de ligne qu'elle a comptée
}

//***********************************************************************************************************************************//
//Fonction permettant de calculer le nombre de caractère de chaque ligne d'un fichier                                                //
//Elle prend comme paramètre le chemin d'acces vers ce fichier sous la forme d'une chaine de caractères                              //
//Elle range le résultat dans un tableau d'int et renvoie le pointeur vers ce tableau                                                //
//La dimension 0 du tableau contient le nombre de ligne total du fichier                                                             //
//La dimension 1 à n contient le nombre de caractère contenu dans la ligne 1 à n
//***********************************************************************************************************************************//
//ATTENTION UN MALLOC EST FAIT DANS CETTE FONCTION, NE PAS OUBLIER DE FAIRE UN FREE APRRES UTILISATION                               //
//***********************************************************************************************************************************//
long* nbrCharParLigne(char *chemin)
{
    FILE *fichier = NULL;               //fichier est un pointeur vers une structure de type FILE
    char caractereActuel = 'a';         //contient le caractère actuellement lu par la fonction
    long nbrCharLigneActuelle = 0;      //contient le nombre de caractère de la ligne en cour de lecture
    long LigneActuelle = 1;             //contient la ligne actuellement en cour de traitement

    long *nbrChar = malloc(sizeof(*nbrChar) * (nbrLigneFichier(chemin) + 1)); //On alloue un tableau qui contient autant de ligne qu'il y'a de ligne dans le fichier
    if (nbrChar == NULL)                //si l'ouverture échoue
    {
        printf("Impossible d'allouer la mémoire"); //on affiche un message d'erreur
        exit(0);                        //on quitte le programme
    }

    fichier = fopen(chemin, "r");       //on ouvre le fichier
    if (fichier == NULL)                //si l'ouverture échoue
    {
        printf("Impossible d'ouvrir le fichier %s",chemin); //on affiche un message d'erreur
        free(nbrChar);                  //on libère la mémoire
        exit(0);                        //on quitte le programme
    }
    
    while (caractereActuel != EOF)      //on continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    {
        caractereActuel=fgetc(fichier); //lecture du fichier caractère par caractère
        nbrCharLigneActuelle++;         //on compte le nombre de caratère dans la ligne
        if(caractereActuel == '\n')     //si on est à la fin d'une ligne (caractères retour à la ligne)
        {
            nbrChar[LigneActuelle]=nbrCharLigneActuelle; //range le nombre de caractère de la ligne dans le tableau
            nbrCharLigneActuelle = 0;   //remise à zéro du compteur, pour pouvoir compter la ligne suivante
            LigneActuelle++;            //incrémentation du compteur de ligne pour la fois d'après
        }
    }
    
    fclose(fichier);                    //on referme le fichier
    nbrChar[0] = LigneActuelle - 1;     //on écrit le nombre de ligne totale dans la dimension 0 du tableau
    return(nbrChar);                    //la fonction renvoie le pointeur du tableau
}

//***********************************************************************************************************************************//
//Fonction qui permet de ranger chaque ligne d'un fichier texte dans une ligne d'un tableau de char                                  //
//Elle prend comme paramètre le chemin d'acces vers ce fichier sous la forme d'une chaine de caractères                              //
//Elle ne renvoie un pointeur sur un tableau 2D de char                                                                              //
//***********************************************************************************************************************************//
//ATTENTION UN MALLOC EST FAIT DANS CETTE FONCTION, NE PAS OUBLIER DE FAIRE UN FREE APRRES UTILISATION   (MALLOC D'UN TABLEAU 2D)    //
//***********************************************************************************************************************************//
/*la suppression ce fait de cette facon
for(int i = 0, i < nblignes; ++i)
{
    free(tabChar[i]);
}
free(tabChar);*/
char** rangeFichierTabChar(char *chemin)
{
    FILE *fichier = NULL;                      //fichier est un pointeur vers une structure de type FILE
    long nbrLigne = 0;                         //contient le nombre de ligne du fichier
    char caractereActuel = 'a';                //contient le caractère actuellement lu par la fonction
    long ligneActuelle = 0;                    //contient la ligne actuellement en cour de traitement
    long nbrCharLigneActuelle = 0;             //contient le nombre de caractère de la ligne en cour de lecture
    char **tabChar = NULL;                     //pointeur de tableaux non initialisé
    long *nbrChar = NULL;                      //pointeur de tableaux non initialisé
    long i = 0;
    
    nbrChar = nbrCharParLigne(chemin);         //appelle de la fonction nbrCharParLigne qui va nous renvoyer un pointeur (voir ci-dessus)
    
    nbrLigne = nbrChar[0];                     //contient le nombre de ligne du fichier
    
    tabChar = malloc(sizeof(char) * nbrLigne); //allocation de la première dimensions du tableau de caractères (la colonne)
    if (tabChar == NULL)                       //si l'ouverture échoue
    {
        printf("Impossible d'allouer la mémoire"); //on affiche un message d'erreur
        exit(0);                                   //on quitte le programme
    }
    
    for(i = 0; i < nbrLigne; i++)        //allocation de la seconde dimensions (les lignes)
    {
        tabChar[i] = malloc(sizeof(char)*(nbrChar[i + 1] + 1)); //On ajoute un char supplémentaire pour pouvoir ajouter le caractère '\0' à la fin de chaque chaine
        if (tabChar[i] == NULL)                //si l'ouverture échoue
        {
            printf("Impossible d'allouer la mémoire"); //on affiche un message d'erreur
            exit(0);                           //on quitte le programme
        }
    }
    
    fichier = fopen(chemin, "r");              //on ouvre le fichier
    if (fichier == NULL)                       //si l'ouverture a  réussie
    {
        printf("Impossible d'ouvrir le fichier %s",chemin); //si l'ouverture échoue
        free(nbrChar);                         //ce pointeur à été initialisé par une fonction utilisant malloc, il faut donc libérer l'espace mémoire réservé
        exit(0);                               //on quitte le programme
    }
    
    for(i = 0; i < nbrLigne; i++)
    {
        if(fgets(tabChar[i], nbrChar[i + 1], fichier) == NULL)
        {
            printf("Erreur 1 dans la fonction rangeFichierTabChar"); //on affiche un message d'erreur
            exit(0);
        }
    }

    fclose(fichier);                           //on referme le fichier
    free(nbrChar);                             //ce pointeur à été initialisé par une fonction utilisant malloc, il faut donc libérer l'espace mémoire réservé
    return(tabChar);
}
mardi 1 novembre 2011 à 19:55:13 | Re : mettre un fichier texte dans un tableau en C

patatalo

Membre Club Administrateur CodeS-SourceS
salut,


tabChar = malloc(sizeof(char) * nbrLigne);
->
tabChar = malloc(sizeof(char*) * nbrLigne);


@++


Cette discussion est classée dans : fichier, ligne, fonction, nombre, tableau


Répondre à ce message

Sujets en rapport avec ce message

lecture de fichier [ par Machuet ] Hello, j'ai plusieurs question concernant la manipulation de fichier. En effet venant de VB, j'aimerais savoir si il existe des fonction pour lire un pb avec tableau et fichier texte [ par krolanta ] Voila mon pb é que g un fichier texte avec des coordonnées et que je voudrais mettre chaque coordonnées ds une case du tableau.En fait ca revient a li [C] lignes d'un fichier dans un tableau : Segmentation fault [ par Michel76 ] Bonjour,Pardonnez-moi de cette question de débutant.Soit un fichier contenant :-----001002-----Je souhaiterais mettre chacune des lignes de ce fichier Tableau multidimensionel et fichiers [ par AngeloVivaldi ] slt à tous.Voila, je voudrai mettre dans un tableau multidimensionel chaque ligne d'un fichier, puis modifier une ligne du tableau pour le réécrire da [DEBUTANT] Fonction rand () [ par kojiro2 ] G un problème avec la fonction rand dans un pti jeuke je suis en train de faire.Je veux générer un nombre aléatoire (jusque là pas de pb).Ce nombre al REcuperer des donnée d'un fichier binaire vers une tableau de hachage [ par whiteknight ] Slt j'ai des problemes avec ma fonction load qui me permet de recuperer les données d'un fichier binaire et de les transférer vers un tableau de hacha pb recuperer nombre de lignes [ par sergio18 ] Bonjourje fais une classe ou je recupere le contenu d'un fichier texte lignes par lignes. Pour cela,j'utilise la fonction fgets et vu qu'elle ne retou écrire dans un fichier text [ par typhoun ] Salut! Je voudrai écrire dans un fichier text mais je ne sais pas comment faire en sorte que j'écrive sur une nouvelle ligne après la fin du text.Je m décomposition d'un nombre en un tableau de caractères en C [ par mcfly66 ] SalutJe souhaiterais réaliser un programme qui me transformerait un nombre en un tableau dans lequel chacune des cases seraient les décimales de ce no Fonction system open() sous linux. [ par bouba ] Bonjour, j'écris un ptit programme qui simule "ls -l | wc -l > baba" et donc compte le "nombre de fichiers" contenu dans le répertoire courant puis éc


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales