• # ta solution ?

    Posté par  . Évalué à 2.

    On peut la voir cette solution ou c'est confidentielle ?
    • [^] # Re: ta solution ?

      Posté par  . Évalué à 1.

      voila:
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <stdio.h>

      int main (int argc, char*argv[])
      {
      int i;
      int byte_lu;
      int d;
      char tampon [1024];
      ssize_t fd;
      for (i=1; i<argc; i++)
      {
      d= open(argv[i],O_RDONLY);
      if(d==-1)
      {
      printf("these file does not exist check the name\n");
      return(2);
      }

      Else{
      While((byte_lu=read(d,tampon,1024)) >0){
      fd= write(STDOUT_FILENO,tampon,byte_lu);
      close(d);

      }
      }


      Return(0) ;


      }







    • [^] # Re: ta solution ?

      Posté par  . Évalué à 0.

      voici ma solution:
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <stdio.h>

      int main (int argc, char*argv[])
      {
      int i;
      int byte_lu;
      int d;
      char tampon [1024];
      ssize_t fd;
      for (i=0; i<argc; i++)
      {
      d= open(argv[i],O_RDONLY);
      if(d==-1)
      {
      printf("these file does not exist check the name\n");
      return(2);
      }

      Else{
      While((byte_lu=read(d,tampon,1024)) >0){
      fd= write(STDOUT_FILENO,tampon,byte_lu);
      close(d);

      }
      }


      Return(0) ;


      }







      Content?
      • [^] # Re: ta solution ?

        Posté par  . Évalué à 4.

        While et Return n'existent pas en C (ni en POSIX), donc ton code tel que posté ne compile pas. Je suppose qu'il y a eu une erreur de copié-collé et qu'un éditeur de texte malappris aura ajouté de lui-même les majuscules.
        while ((byte_lu = read(d, tampon, 1024)) > 0)
        {
            fd = write(STDOUT_FILENO, tampon, byte_lu);
            close(d);
        } 
        Le close se trouvant dans la boucle, tu n'afficheras au plus que 1024 octets de chaque fichier. Le close devrait se trouver en-dehors de la boucle while. Sinon, ton programme fait bien ce qu'il faut (en passant, ça ne sert à rien de récupérer la valeur de retour de write si tu ne l'utilises pas).
      • [^] # Re: ta solution ?

        Posté par  . Évalué à 2.

        Content?
        Oui, maintenant, je peus poster la mienne.
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        #include <unistd.h>
        #include <stdio.h>
        
        void usage(char **av)
        {
                printf("Usage: %s [FILES] ...\n", av[0]);
        }
        
        int main (int ac, char **av)
        {
                int i, fd;
                ssize_t byte_lu;
                char buffer[1024];
        
                if (ac < 2)
                        usage(av);
        
                for (i=1; i<ac; i++)
                {
                        fd = open(av[i],O_RDONLY);
        
                        if (fd == -1)
                                perror("open: ");
                        else
                        {
                                while((byte_lu=read(fd,buffer, sizeof(buffer))))
                                        write(STDOUT_FILENO, buffer, byte_lu);
        
                                close(fd);
                        }
                }
        
                return 0;
        }
        
        Et comme je sais que d'autres ont leur solution, j'aimerais la voir aussi (si ça les dérange pas évidemment) :) (on a toujours à apprendre du code des autres)
        • [^] # Re: ta solution ?

          Posté par  . Évalué à 2.

          Je n'y avais pas fait attention avant, mais read renvoie -1 dans certains cas d'erreur (SUSv3 précise plusieurs cas). Dans ce cas, la valeur -1 est affectée à byte_lu (qui est signé donc il n'y a pas de problème) puis, -1 étant non nul, la condittion de ton while est vraie. Le write est donc exécuté.

          Sauf que write attend un troisième argument de type size_t, et que tu lui donnes la valeur-1. size_t étant non signé, la conversion se fait modulo la valeur maximale représentable par ce type +1, soit SIZE_MAX + 1. write reçoit donc la valeur SIZE_MAX (i.e. SIZEMAX + 1 - 1). write va donc essayer de lire autant d'octets dans ton tableau pour les écrire... D'où un comportement indéfini par :
          - lecture de données non initialisées si c'est le tout premier appel à read qui plante ;
          - et débordement de tableau dans le cas quasi-certain où SIZE_MAX est supérieur à 1024.

          A part ça, question de style, je place toujours les accolades autour des blocs if, else, while... Surtout, quand le bloc d'un if est entre accolades, je mets les accolades aussi autour du bloc else (et réciproquement), même si un des blocs ne fait qu'une ligne. Je dis ça surtout par rapport à ton :
              if (fd == -1)
                  perror("open: ");
              else
              {
                  /* ... */
              }
  • # plusieurs posts pour le meme sujet

    Posté par  . Évalué à 3.

    Il n'est pas interdit de se repondre à soi meme plutot que de creer des nouveaux postq

    Debut du probleme :
    http://linuxfr.org/forums/19/19853.html

    Suite
    http://linuxfr.org/forums/19/19861.html

    Et fin : ici
    • [^] # Re: plusieurs posts pour le meme sujet

      Posté par  . Évalué à 1.

      Dans ce cas-ci, on lit byte_lu puis boucle infinie puisque cette variable ne change plus,

      byte_lu=read(d,tampon,1024);
      while(byte_lu >0){
      fd= write(d,tampon,1024);
      } printf("%s",tampon[i]);

      close (d);


      Dans l'autre cas
      while((byte_lu=read(d,tampon, 1024)), !NULL)
      {
      printf("%d",d);
      close(d);
      }

      byte_lu = retour de fonction read, et comme 0=0 est vrai, alors boucle infinie :-), en fait on aurait du avoir (byte_lu=read()) != 0

      http://man.developpez.com/man2/read.2.php

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.