Fonction getline renvoie (null)

gbenrais Messages postés 3 Statut Membre -  
gbenrais Messages postés 3 Statut Membre -
Bonjour,
Je n'utilise pas le C tous les jours, ma question est peut-être évidente.
J'utilise une application commerciale qui est un ensemble de programmes C et de librairies statiques C.
La commande de compilation finale est :
cc myfunction.o library.a -lm -o pgm

Tout se passe très bien sauf pour getline qui renvoie tout le temps (null). Je l'utilise pourtant de la façon la plus basique :
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
void myfunction(){
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    fp = fopen("someFile.txt", "r");
    if (fp == NULL){
        exit(EXIT_FAILURE);
    }
    while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu:\n", read);
        printf("%s\n", line);
    }
}

Cette fonction fonctionne très bien si je l'isole dans une tout petit programme qui ne contiendrait qu'un appel à cette fonction.
Je me demande donc si la librairie statique library.a interfère et ce comment ?
Merci,
Ghislain

4 réponses

  1. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    Bonjour,

    La réponse ne semble pas si évidente.
    La fonction ne devrait retourner 0 que si le fichier est effectivement vide.
    La bibliothèque statique peut interférer si elle contient une fonction qui a exactement le même nom et dans ce cas elle intercepterait la fonction de la bibliothèque de base.
    1
  2. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    Il n'y a pas de
    namespace
    en C, dommage.
    Peut-être en forçant le chargement de la bibliothèque standard avant library.a mais bof.
    Il te reste à réécrire cette fonction en lui donnant au autre nom.
    int mon_getline( char** lineptr , size_t* plg , FILE* file ) {
      if ( !lineptr  ||  !plg  ||  !file ) {
          errno = EINVAL;
          return  -1;
      }
      if ( ferror( file ) )
          return  -1;
      if ( feof( file ) )
          return  -1;
      
      char  line[255+1];
      line[255] = '\0';   // needed if the line needs severals reads
      size_t  written = 0;
      size_t  len;
    
      do {
          if ( !fgets( line , 255 , file ) )
              return  -1;
          char*  ptr = strchr( line , '\n' );
          if ( ptr )
              *ptr = '\0';
          len = strlen( line );  // <255 if line is complete
       
          if ( written+len+1 > *plg ) {
              ptr = realloc( *lineptr , written+len+1 );
              if ( !ptr )
                  return  -1;
              *plg = written+len+1;
              *lineptr = ptr;
          }
          memcpy( *lineptr + written , line , len+1 );
          written += len;
      } while ( len == 255 );  // the read was incomplete, continue
    
      return  (int)written;
    }
    1
  3. gbenrais Messages postés 3 Statut Membre
     
    Bonjour Dalfab,
    Merci pour ta réponse, getline ne renvoie pas (null), elle renvoie 0 et affecte (null) à line, excuse pour l'erreur.
    Ton intuition doit être la bonne. Y a t il moyen en C d'utiliser qqe chose comme les namespaces pour gérer les situations de doublons de noms ? Je pourrai alors faire référence à la bonne fonction getline de stdio.
    Merci
    0
  4. gbenrais Messages postés 3 Statut Membre
     
    Bonjour Dalfab,
    J'ai utilisé ta fonction et ça marche très bien, merci !
    0