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

  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 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.

  7. #7
    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...

  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.

  9. #9
    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 cette derniere reponse mais j'ai encore une derniere question, je ne peux pas faire le malloc apres le return, mais si je le fais avant, je ne retournerais pas la bonne valeur etant donne que j'aurais libere l'espace memoire vers lequel le pointeur que je retourne pointe ? non ?

  10. #10
    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
    Je suppose que tu voulais parler du free(). Inutile de "freer" si tu retournes une valeur contenue dans une variable mallocé.
    Tu as une definition des pointeurs un peu floue, revois vite ca.

  11. #11
    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
    Merci de cette derniere reponse mais j'ai encore une derniere question, je ne peux pas faire le malloc apres le return, mais si je le fais avant, je ne retournerais pas la bonne valeur etant donne que j'aurais libere l'espace memoire vers lequel le pointeur que je retourne pointe ? non ?
    T'as t-on contraint d'utiliser malloc ?


    Sinon il y a une régle qui dis que tout code aprés un return n'est pas executé ce qui fais que ton free la ou il se situe et soit la pour décorer ou pour autre chose mais dans tout les cas ici inutile.

  12. #12
    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 hegros
    T'as t-on contraint d'utiliser malloc ?
    Tu ne vas quand même pas retourner l'adresse d'un tableau local...

  13. #13
    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 Stevie Wonder
    Une methode simple, compte tenu de ce dont vous avez le droit:

    Deja, pas la peine de malloc ton buffer <...> 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.
    Il n'a pas le droit à realloc(). Mais on peut le simuler avec malloc(), free() et une boucle de copie... C'est très crade mais c'est sans doute fait exprès...

  14. #14
    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
    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 ?
    Après usage, c'est à dire, ici, dans le main()...

  15. #15
    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
    Citation Envoyé par Emmanuel Delahaye
    Tu ne vas quand même pas retourner l'adresse d'un tableau local...
    Je pensais plus à le déclarer static si vraiment il fallait utiliser malloc mais bon...

  16. #16
    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
    Citation Envoyé par Emmanuel Delahaye
    Il n'a pas le droit à realloc(). Mais on peut le simuler avec malloc(), free() et une boucle de copie... C'est très crade mais c'est sans doute fait exprès...
    Le mot "realloc" que j'ai employé ne signifiait pas utiliser LE realloc() std, nuance, comme je l'ai dit plus haut, il n'a pas le droit d'utiliser les fonctions qu'il n'a pas recodé, il est tres facile de se faire un realloc de fortune comme tu viens de le preciser.

  17. #17
    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
    Citation Envoyé par Emmanuel Delahaye
    Après usage, c'est à dire, ici, dans le main()...
    Le main ne sera pas compris dans le code en fait, ils doivent juste fournir la fonction (en vue de se faire une librairie perso qui palliera les libs std). Je suis egalement dans cette ecole, je suis passé par la.

  18. #18
    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
    J'ai une petite question et j'en aurais fini :

    Citation Envoyé par Emmanuel Delahaye
    Après usage, c'est à dire, ici, dans le main()...
    Mes pinteur etant declares dans une autre fonction que mon main, je ne comprends pas comment je peux faire un free dans le main ?

    A moins que je le fasse sur l'adresse que j'ai retournee et que j'ai recu dans le main ?

  19. #19
    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
    Mes pinteur etant declares dans une autre fonction que mon main, je ne comprends pas comment je peux faire un free dans le main ?

    A moins que je le fasse sur l'adresse que j'ai retournee et que j'ai recu dans le main ?

  20. #20
    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
    ok merci pour toutes vos reponses

+ 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