Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de condition avec pointeur sur tableau de char

la boucle ne sort plus pourtant la condition est verifiee

    28 avril 2006 à 16:57:41

    bonjour :(

    j' essaie de faire une fonction qui lit une ligne de fichier texte, enregistre sa longueur et relit la ligne a nouveau pour la mettre dans un tableau de char specialement taillé.


    probleme : ma boucle ne s arrete pas a la fin de la ligne pourtant elle detecte bien le caractere de fin de ligne : :o



    #include <stdio.h>
    #include <stdlib.h>
    #include "define.h"


    //je travaille dans main avant de prototyper mes fonctions
    int main(int argc, char *argv[])
    {
        int pos = 0, len;
        char* line;
        FILE* stream = NULL;



        stream = fopen("d:\\aida\\aida\\test.txt", "r");
        if(stream == NULL)
        {
            fprintf(stderr,"impossible d'ouvrir le fichier\n");
            exit(1);
        }

    //je garde la position du curseur au debut de ligne
    //car la fonction fera plus tard toutes les autres lignes du fichier...
        pos = ftell(stream);

    //lis toute la ligne et renvoie le nombre de characteres
        for (len = 0; fgetc(stream) != '\n'; len++)
            ;

    //dimensionne le tableau
        line = malloc(len * sizeof(char) + 1);

    //revient au debut de la ligne, j ai pris cette methode car ca evite
    //de se deplacer charactere par charactere avec fseek, puisqu il parait
    //que ca pose probleme.
        fseek(stream, 0, pos);

    //enregistre la ligne dans le tableau de char et affiche, case par case
        for (len = 0; *(line + len) != '\n'; len++)
        {
            *(line + len) = fgetc(stream);
            printf("case %d = %d", len, *(line + len));
            system("pause");
        }
       
    //marque le charactere de fin de chaine, en place du charactere de fin de ligne
        *(line + len) = '\0';
        printf("%s", line);
        system("pause");

        if (fclose(stream) != 0)
        {
            printf("Impossible de fermer le fichier test.txt");
        }

        return 0;
    }



    arrive au bout le la ligne (120eme charactere), il continue de me dire :
    "case 120 = 10, appuyez sur une touche pour continuer..."
    "case 121 = 10, appuyez sur une touche pour continuer..."
    "case 122 = 65, appuyez sur une touche pour continuer..." o_O


    et il continue jusqu a la fin du fichier.
    je ne comprend pas... j ai essaye de remplacer '\n' par sa valeur 10 mais ca ne change rien. :colere2:

    aidez moi svp je suis un peu perdu la. :(



    Edit : ok j' ai contourne le probleme en declarant une autre variable mais ca ne m aide pas a comprendre ou etait mon erreur :(

    si ca interresse quelqun, voici le code qui fonctionne :


    #include <stdio.h>
    #include <stdlib.h>
    #include "define.h"


    //je travaille dans main avant de prototyper mes fonctions
    int main(int argc, char *argv[])
    {
        int pos = 0, len, i;
        char* line = {0};
        FILE* stream = NULL;



        stream = fopen("d:\\aida\\aida\\test.txt", "r");
        if(stream == NULL)
        {
            fprintf(stderr,"impossible d'ouvrir le fichier\n");
            exit(1);
        }

    //je garde la position du curseur au debut de ligne
    //car la fonction fera plus tard toutes les autres lignes du fichier...
        pos = ftell(stream);

    //lis toute la ligne et renvoie le nombre de characteres
        for (len = 0; fgetc(stream) != '\n'; len++)
            ;

    //dimensionne le tableau
        line = malloc(len * sizeof(char) + 1);

    //revient au debut de la ligne, j ai pris cette methode car ca evite
    //de se deplacer charactere par charactere avec fseek, puisqu il parait
    //que ca pose probleme.
        fseek(stream, 0, pos);

    //enregistre la ligne dans le tableau de char et affiche, case par case
        for (i = 0; i < len; i++)
        {
            *(line + i) = fgetc(stream);
            printf("case %d = %d", i, *(line + i));
            system("pause");
        }

    //marque le charactere de fin de chaine, en place du charactere de fin de ligne
        *(line + len) = '\0';
        printf("%s", line);
        system("pause");

        if (fclose(stream) != 0)
        {
            printf("Impossible de fermer le fichier test.txt");
        }

        return 0;
    }



    o_O en remplacant
    for (len = 0; *(line + len) != '\n'; len++)
        {
    par
    for (len = 0; *(line + len - 1) != '\n'; len++)
        {


    j obtient :

    "case 120 = 10, appuyez sur une touche pour continuer..."
    *****affichage de la ligne*****, appuyez sur une touche pour continuer..."
    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2006 à 3:31:50

      Hello !

      J'ai fini par trouver !!! Hiiiiiaaaa ! :D

      Bon, alors le principal changement c'est:
          for (len = 0; *(line + len-1) != '\n'; len++) /* MODIF */

      La différence, j'ai ajouté un -1 (Ça fait drôle dit comme ça)... c'est parce qu'au moment du test *(line + len) != '\n', la variable len est déjà incrémentée, donc tu testes la "case" d'après de ton tableau de char, qui contient n'importe quoi...

      D'ailleurs, quand len=0, *(line+len) ou *(line + len-1) sont dans les patates tous les deux. Peut-être que do {...} while (...); serait plus approprié.

      En fait, je ne sais pas si tu es obligé de faire comme ça, mais il me semble qu'une solution à base de fgets, strlen (ou sizeof/sizeof), strcpy (ou memcpy) avec un char tampon[xxx] serait plus simple.

      J'ai aussi changé:
          line = malloc((len+1) * sizeof(char)); /* MODIF */

      ... je ne sais pas pourquoi ça fonctionne même sans ça. Il y a des cas où le compilateur comprend tout seul que "+1" signifie "+1*sizeof(le type dont on parle à ce moment là), c'est peut-être ce qui arrive ici.

      Bon, voilà... on sait pourquoi ça passait tout droit, mais le code demande encore un peu de réflexion....

      Bon courage :)

      • Partager sur Facebook
      • Partager sur Twitter

      probleme de condition avec pointeur sur tableau de char

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown