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 :

Aide a la comphrehension d une fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut Aide a la comphrehension d une fonction
    Bonjour,

    J ai trouvé une fonction sur internet qui permet de lire une ligne dans un fichier.
    Quelqu un pourrait il m aider a comprendre le code car je ne le comprend pas trop !

    Merci de votre aide .

    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
     
    # define MEM_SIZE 2048
     
    char            *get_next_line(const int fd)
    {
      char          *str;
      static char   buffer[MEM_SIZE];
      static int    i = 0;
      int           j;
      static int    k = 0;
     
      j = 0;
     
      str = malloc(MEM_SIZE * sizeof(char));
      if (k == 0)
        k = read(fd, buffer, MEM_SIZE);
     
      if (i == k)
        return (NULL);
     
      while (i < k && buffer[i] != '\n')
        {
          str[j] = buffer[i];
          i = i + 1;
          j = j + 1;
        }
     
      if (buffer[i] == '\n')
        i = i + 1;
     
      str[j] = '\0';
     
      return (str);
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Ce code est très mauvais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # define MEM_SIZE 2048
     
    char            *get_next_line(const int fd)
    {
      char          *str;
      static char   buffer[MEM_SIZE];
      static int    i = 0;
      int           j;
      static int    k = 0;
    Début de fonction, définition et initialisation de variables

    Ligne inutile puisque on peut la supprimer et initialiser j à la définition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      str = malloc(MEM_SIZE * sizeof(char));
    str est donc un tableau de MEM_SIZE caractères. Mais c'est complétement moche de faire cela : voir après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (k == 0)
        k = read(fd, buffer, MEM_SIZE);
    Le test ne sert à rien puisque k ne sera jamais modifié avant sa définition/ initialisation et ici
    Et en plus il n'a aucune signification: qu'est ce qu'on s'en fiche de la valeur de k puisqu'elle va être écrasée?

    Là on lit un fichier qui a été ouvert avec la fonction fopen
    Du moins il faut l’espérer

    De plus ce n'est pas la fonction read qui faut utiliser mais fread

    Donc on a lu k caractères du fichier fd et ces k caractères sont mis dans buffer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (i == k)
        return (NULL);
    Là: code pourri
    1. On teste si on a lu aucun caractère avec la variable i qui n'a rien à faire dans le test
    2. Fuite mémoire parce que str n'a pas été libéré


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      while (i < k && buffer[i] != '\n')
        {
          str[j] = buffer[i];
          i = i + 1;
          j = j + 1;
        }
    Ici on va recopier une ligne (tous les caractères avant le fameux '\n') dans notre tableau str.

    Au passage soit i soit j est inutile et on peut utiliser qu'une seule variable

    Et c'est là que le malloc est mal fait. Parce qu'on va créer un tableau de MEM_SIZE caractères, mais une ligne peut avoir moins de caractères (au plus k).

    Le mieux à faire c'est de chercher la taille de cette ligne et ensuite, de faire le malloc et un strncpy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (buffer[i] == '\n')
        i = i + 1;
    Code inutile

    Le caractère '\0' pour dire "fin de chaîne de caractères"

    On retourne notre tableau qu'il faudra libérer après utilisation

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut
    Merci pour ta reponse, je comprends mieux, il est vrai que ce code n est pas vraiement optimisé.

    Le plus gros probléme pour moi est que si par exemple ce que je veux lire fais 1500 caracteres et que j ai un buffer de 512, cette fonction ne va lire que 512 caracteres.

    Comment je peux faire pour modifier le code et qu il fonctionne peu importe la taille du buffer ?

    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Il existe realloc() pour modifier la taille d'une zone mémoire allouée par malloc() (et donc l'agrandir sans perdre son contenu).

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    la fonction read existe

    La différence avec la fonction fread:
    read() is a low level, unbuffered read. It makes a direct system call on UNIX.

    fread() is part of the C library, and provides buffered reads. It is usually implemented by calling read() in order to fill its buffer.
    Je ne comprends pas la question

    Si tu veux lire X caractères, soit
    • tu lis X caractères avec la fonction fread, ou une autre
    • tu as un buffer plus petit que X, alors tu fais une boucle for ou while, en gérant bien la dernier lecture qui peut-être non complète


    Et pour le malloc, soit tu réalloues ton buffer avec la fonction calloc au fur et à mesure, soit tu fais un test ou un parcours pour connaître la taille totale avec un fseek au début si nécessaire

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut
    merci de vos reponses, c est bien ce que je veux faire, une boucle while si mon buffer est plus petit que ce que je veux lire, mais je suis un peu perdu concernant la methode a suivre

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/05/2014, 22h04
  2. Aide pour la création d'une fonction - moyenne mobile exponentielle
    Par antoineDG dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2012, 17h13
  3. aide sur l'utilisation d'une fonction d'objet
    Par ssaidof dans le forum Débuter
    Réponses: 1
    Dernier message: 31/12/2010, 05h24
  4. Regroupement de code à l'aide d'une fonction...
    Par JeremieT dans le forum Access
    Réponses: 6
    Dernier message: 09/01/2006, 10h53
  5. Besoin d'aide sur une fonction
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2005, 17h40

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