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 :

des caractère bizare


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut des caractère bizare
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    long  fsize(FILE* fd)
    {
       long size;
       fseek(fd, 0, SEEK_END);       /* aller en fin */
       size = ftell(fd);             /* lire la taille */
       return size;
    }
     
     
    int main()
    {
        FILE *f;
        int k=1;
        int i;
        int l=0;
        char *c;
     
        f = fopen("test.txt", "r");
     
        if(f!=NULL)
        {
     
                   l = fsize(f);
                   c = (char *)malloc(l*sizeof(char));
     
                   //fgets(c,l,f);
     
                   for(i=0; i<l; i++)
                   {     
                         c[i]=fgetc(f);//Personne n'est chouqée?
                         printf("%s\n",c);
                         if ( c[i] == '\n')//Personne n'est chouqée?
                         {
                                k++;
                         }
                   }
          }
     
        printf("l=%d\tk=%d\n",l,k);
        system("PAUSE");
        fclose(f);
        return 0;   
    }
    Ce code est sensé calculer le nombre de ligne dans un fichier, J'affiche les caractère pour debogguer, ca affiche un caractère bizare

    Le plus simple pour mieu comprendre serai d'executer ce code et voir, n'oublier de créér un fichier test.txt
    Merci pour l'aide

  2. #2
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut
    Un else au cas où il y ai une erreur lors de l'ouverture.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    else 
    {
     puts("Erreur lors de l'ouverture du fichier");
     exit(EXIT_FAILURE);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c[i]=fgetc(f);//Personne n'est choquée?
                         printf("%s\n",c);
    A chaque tour de la boucle ton printf va t'afficher ce qui à été lu, exemple ton fichier contient : abcdefgh
    ca va te donner ça :
    aababcabcdabcdeabcdefabcdefgabcdefgh

    Quel caractère t'affiche le déboguage ? As-tu essayer de le compiler directement ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut
    Citation Envoyé par Shugo78
    Un else au cas où il y ai une erreur lors de l'ouverture.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    else 
    {
     puts("Erreur lors de l'ouverture du fichier");
     exit(EXIT_FAILURE);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    c[i]=fgetc(f);//Personne n'est choquée?
                         printf("%s\n",c);
    A chaque tour de la boucle ton printf va t'afficher ce qui à été lu, exemple ton fichier contient : abcdefgh
    ca va te donner ça :
    aababcabcdabcdeabcdefabcdefgabcdefgh

    Quel caractère t'affiche le déboguage ? As-tu essayer de le compiler directement ?
    et comment je peux rectifier ca de façon a afficher abcdefgh?

  4. #4
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut
    Tu affiche la chaine lue et entière après la boucle.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut
    effectivement ma question a été un peu bete,
    Disant que j'ai fait ca avant de lir ton message, mais ca me renvoie une ligne vide, sinon le l affiche la bonne valeur

  6. #6
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long  fsize(FILE* fd)
    {
       long size;
       fseek(fd, 0, SEEK_END);       /* aller en fin */
       size = ftell(fd);             /* lire la taille */
       rewind(fd);                 /* revenir au debut */
       return size;
    }


    ensuite, tu perd du temps a faire un fgetc par charactére ...
    tu connais la taille a lire
    fait un gros fread sur tout ton fichier. (en plus t'as alloué un buffer de la taille de ton fichier !)

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par amine_en_france
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        int i;
        char *c;
                   c = (char *)malloc(l*sizeof(char));
     
                         c[i]=fgetc(f);//Personne n'est chouqée?
                         printf("%s\n",c);
    printf() avec "%s" veut une chaine valide. Pour que c soit une chaine valide, elle doit être terminée par un 0. Ce n'est pas le cas. Le comportement est donc indéterminé : tout peut arriver.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Par défaut On déborde un peu du sujet
    Je reviens remettre le code qui ne marche toujours pas

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    long fsize(FILE *f)
    {
         long l;
         fseek(f,0,SEEK_END);
         l=ftell(f);
         rewind(f);
         return l;
    }
     
    int main()
    {
        FILE *f;
        int k=0;
        int i;
        int l=0;
        char *c="bonjour";
     
        f = fopen("tst.doc", "r");
     
        if(f!=NULL)
        {
                   l=fsize(f);
                   c=(char *)malloc(l*sizeof(char));
                   fread(c,l,5000,f);
                   for(i=0; i<l; i++)
                   {     
     
        /*                 if ( c[i] == "\n")
                         {
                                k++;
                         }
          */         }
                     printf("%s\n",c);
          }
     
        printf("l=%d\tk=%d\n",l,k);
        system("PAUSE");
        fclose(f);
        return 0;   
    }
    et j'obtiens tjs le meme caractère bizare, mais qu'une fois. et j'ai pas compris l'histoire du zero a la fin, j'ai pas compris comment terminer la liste par 0

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par amine_en_france
    Je reviens remettre le code qui ne marche toujours pas

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    long fsize(FILE *f)
    {
         long l;
         fseek(f,0,SEEK_END);
         l=ftell(f);
         rewind(f);
         return l;
    }
     
    int main()
    {
        FILE *f;
        int k=0;
        int i;
        int l=0;
        char *c="bonjour";
     
        f = fopen("tst.doc", "r");
     
        if(f!=NULL)
        {
                   l=fsize(f);
                   c=(char *)malloc(l*sizeof(char));
                   fread(c,l,5000,f);
                   for(i=0; i<l; i++)
                   {     
     
        /*                 if ( c[i] == "\n")
                         {
                                k++;
                         }
          */         }
                     printf("%s\n",c);
          }
     
        printf("l=%d\tk=%d\n",l,k);
        system("PAUSE");
        fclose(f);
        return 0;   
    }
    et j'obtiens tjs le meme caractère bizare, mais qu'une fois. et j'ai pas compris l'histoire du zero a la fin, j'ai pas compris comment terminer la liste par 0
    Tu ne sais pas qu'une chaine C doit être terminée par un 0 ? C'est un peu le B.A. BA du langage C, non ?

    Si tu mets des caractères dans le tableau c,
    le dernier doit être 0 pour que c soit traité correctement par les fonctions attendant des chaines (comme printf() avec "%s", par exemple...)

    Au fait, pourquoi 'l, 5000' et pas 'l, 1' ? C'est un peu incohérent comme code, non ?

    Je verrais (l est illisible, je mets n à la place) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                  n = fsize(f);
                  c = malloc (n + 1);
                  fread(c, n, 1, f);
                  c[n] = 0;
                  printf ("%s", c);

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

Discussions similaires

  1. Chaînes avec des caractères accentués dans Interbase
    Par Invité dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/03/2004, 22h39
  2. [Débutant][JSP] Ajout des caractères à une String...
    Par Henkyl dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 04/03/2004, 16h30
  3. Substituer des caractères d'un AnsiString
    Par Walm dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/12/2003, 10h02
  4. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 17h54
  5. insérer des caractères accentués INFORMIX/JDBC
    Par donde dans le forum Informix
    Réponses: 2
    Dernier message: 19/11/2002, 20h02

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