Char **

PADYVEN Messages postés 69 Date d'inscription lundi 10 février 2003 Statut Membre Dernière intervention 29 août 2012 - 17 nov. 2007 à 21:42
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 17 nov. 2007 à 21:58
Si quelqu'un peut jeter un oeil sur ce code et le critiquer merci
(constructive les critiques :-))

j'ai un probleme tout bete
ce programme lit un fichier texte le stocke dans un char *
puis on parcours le char etoile pour creer un tableau de pointeur
pour chaque debut de ligne

tout marche correctement sauf quand je veux afficher a la fin
car le printf %s attend un \0 pour terminer la chaine hors je n'en mais pas
et je ne veux pas reallouer mon char * 36000000 de fois

si quqlqun peut me dire comment corriger et ameliorer ca ce serait sympa

merci d'avance

//**********************************************
void LitFichier44()
{//ouvre un fichier le stocke dans un char*

    int longeur=0;
    FILE* fichier = NULL;
    char **tableauligne=NULL;
    char *letexte=NULL;
    long nbrlignes=0;
    long i=0,
    long j=0;


    fichier = fopen("test.txt", "r");  //ouvre le fichier en lecture
    if (fichier != NULL)
    {
        //nombre de char du fichier
        fseek(fichier, 0, SEEK_END);       //se positionne a la fin
        longeur=ftell(fichier);            //longeur=taille du fichier
        printf("longeur du fichier %ld\n",longeur);


        //fout le fichier dans un char *
        letexte=(char*)malloc(longeur*sizeof(char)); //alloue la memoire pour le fichier
        system("pause");
        rewind(fichier);       //se positionne au debut
        while(i<longeur)
        {
            letexte[i]=fgetc(fichier);
            //compte le nombre de ligne
            if (letexte[i]=='\n') nbrlignes++;
            i++;
        }
        fclose(fichier); //ferme le fichier


        //affiche le texte
        printf("%s\n",letexte);
        printf("Nombre de lignes %ld\n",nbrlignes);
        system("pause");


        //pour les lignes
        tableauligne=(char**)malloc(nbrlignes*sizeof(char*));
        tableauligne[0]=letexte;
        for (i=1;i<nbrlignes-1;i++)
        {
            while (letexte[j]!='\n')
            {j++;}
            tableauligne[i]=&letexte[j+1];
            j+=1;
        }


       /* le probleme est ici */
        //affiche ligne par ligne
        for (i=0;i<nbrlignes-1;i++)
        {
            //en toute bonne logique c ca m'affiche du pointeur juqu'a la fin du char 
            //comment corriger ca
            printf("\tLigne: %ld ->%s",i,tableauligne[i]);
        }


        free(letexte);
        free(tableauligne);
    }
    printf("\n");
}

1 réponse

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
17 nov. 2007 à 21:58
1. Tu lis ton fichier octet par octet ce que je déconseille très fortement. Si ton fichier n'est pas volumineux, lis le tout d'un coup puis navigue dans le buffer avec un pointeur.

2. Il suffit d'ajouter toi même le 0 de fin de chaine. Alloue taille_du_fichier+1 octets de mémoire et après la lecture, tu ajoutes buffer[nombre_doctets_lu] = 0

C++ (@++)<!--
0
Rejoignez-nous