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 :

Lecture de la premiere ligne d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de ze veritable farf
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut Lecture de la premiere ligne d'un fichier
    Bonjour, j'ai un petit soucis, j'utilise read, pour lire dans un fichier (ce qui fonctionne tres bien) mais je voudrais ne lire que la premiere ligne de ce dernier, mais je n'arrive pas, votre aide me serait d'un grand secours. Merci d'avance.

    Voici ma fonction :

    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
    char    *get_my_line(int fd)
    {
      int   nb_read;
      char  *buffer;
      int i = 0;
     
      buffer = (char *) malloc(sizeof(char) * 512);
      while ((nb_read = read(fd, buffer, 512)) > 0 && buffer[i] != '*')
            write(1, buffer, nb_read);
      if (nb_read == (-1))
        {
          return ("file is empty !");
        }
      return (buffer);
      free(buffer);
    }
    et voici mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int     main(int ac, char **argv)
    {
      char  *line;
      int   fd;
     
      fd = open(argv[1], O_RDONLY);
      get_next_line(fd);
      close(fd);
      return (0);
    }

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    fgets est parfait pour la lecture d'une ligne....

    Ton code est relativement compliqué pour rien tu alloues une taille connue à l'avance dans ce cas ne devrais-tu pas passer par un tableau automatique char t[512] ?

    D'autant plus que le free n'est jamais executé...Tu as eu aucun warning aucun message d'avertissement de ton compilateur ?
    Quel compilateur utilises-tu ?

  3. #3
    Membre confirmé Avatar de ze veritable farf
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    Pour ce qui est du compilateur, j'utilise cc, et en fait, je n'utilise pas fgets car je suis actuellement en formation C/Unix et mon patron m'interdit d'utiliser autre chose que open, read et write pour cet exercice.

    Mais j'ai du mal a m'en sortir ...

  4. #4
    Membre confirmé Avatar de ze veritable farf
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    par contre, aucun message du compilateur et affichage du fichier entier OK.

  5. #5
    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 ze veritable farf
    par contre, aucun message du compilateur et affichage du fichier entier OK.
    Supaïr ton compilo. Tu fais un free() après un return et il ne dit rien ? Manque pas des options de compilation pour le rendre plus bavard ?

  6. #6
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Oh tien un ptit gars d'EPITECH Tek1? Tek2? Moi Tek2... Bref...

    Je tien a signaler, pour ceux qui repondront a ta question dans le futur, que ceci est un exercice donné par l'ecole EPITECH et que les eleves sont tres restrincts. En effet, ils n'ont pas le droit d'utiliser les libs std, ils n'ont droit que aux fonctions qu'ils ont recodé d'eux meme (pour l'instant).

    Une methode simple, compte tenu de ce dont vous avez le droit:

    Deja, pas la peine de malloc ton buffer (et jamais de free() apres ton retour de valeur, c'est useless au possible), declare le simplement en lui accordant un nombre de case du genre : char buffer[BUFF_SIZE]; admettons.
    Tu peux utiliser une macro pour la taille de ton buffer (#define BUFF_SIZE 512).Dans ta boucle ensuite, tu peux copier ton buffer dans une chaine de char prealablement mallocé avec la taille du buffer + 1, caractere par caractere tout en checkant si il n'y a pas de \n ou de \0. Si c'est le cas tu retournes la chaine. Sinon tu realloc ta chaine de char avec (BUFF_SIZE + 1) x le nombre de fois que tu read.

    C'est une methode. Mais de mémoire, l'exo etait plus compliqué que ca...

  7. #7
    Membre confirmé Avatar de ze veritable farf
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    Je vais reprendre, car je crois que je n'ai pas ete tres clair, ma fonction prends pour unique parametre un file descriptor, et doit retourner la premiere ligne et uniquement la premiere ligne de ce fichier, pour le faire, je n'ai a disposition que malloc, free, open, read et write.

    Pour l'instant, le code suivant affiche (et non pas retourne) l'integralite du fichier. Je voudrais donc savoir comment recuperer uniquement la premiere ligne et comment la stoker dans un char* afin de la retourner directement en vue d'une expoitation ulterieure.

    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
    char    *get_my_line(int fd)
    {
      int   nb_read;
      char  *buffer;
      int i = 0;
     
      buffer = (char *) malloc(sizeof(char) * 512);
      while ((nb_read = read(fd, buffer, 512)) > 0)
        write(1, buffer, nb_read);
      if (nb_read == (-1))
        {
          return ("file is empty !");
        }
      return (buffer);
      free(buffer);
    }
    Merci.

  8. #8
    Membre confirmé Avatar de ze veritable farf
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    Merci de vos reponses mais au lieu de me dire que mon compilateur c'est de la merde, pourriez vous m'indiquer ou dois-je mettre mon free ?

    Je suis desole mais je debute en C et je ne maitrise pas encore tres bien. Je viens du Java et la gestion de la memoire est quand meme nettement plus aisee.

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

Discussions similaires

  1. Afficher les n premières lignes d'un fichier
    Par aline dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/09/2006, 10h44
  2. lire premiere ligne d un fichier
    Par lathiolle dans le forum Langage
    Réponses: 3
    Dernier message: 29/08/2006, 15h33
  3. [CSV] Ne lire que la premiere ligne d'un fichier CSV
    Par passie dans le forum Langage
    Réponses: 7
    Dernier message: 05/07/2006, 12h02
  4. comment effacer la premiere ligne dans un fichier
    Par aliosys dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/12/2005, 10h14
  5. Supprimer la premiere ligne d'un fichier
    Par Kahiba dans le forum Langage
    Réponses: 7
    Dernier message: 11/02/2003, 10h18

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