Listing 1 Concatenates files to standard output

/* cat.c:    concatenate files */

#include <stdio.h>
#include <assert.h>

void copy(FILE *, FILE *);

main(int argc, char **argv)
{
   int i;
   FILE *f;
   FILE *std_out = fdopen(fileno(stdout),"wb");

   assert(std_out != NULL);
   for (i = 1; i < argc; ++i)
      if ((f = fopen(argv[i],"rb")) == NULL)
         fprintf(stderr,"cat: Can't open %s\n",argv[i]);
      else
      {
         copy(f,std_out);
         fclose(f);
      }
   return 0;
}

void copy(FILE *from, FILE *to)
{
   size_t count;
   static char buf[BUFSIZ];

   while (!feof(from))
   {
      count = fread(buf,1,BUFSIZ,from);
      assert(ferror(from) == 0);
      assert(fwrite(buf,1,count,to) == count);
      assert(ferror(to) == 0);
   }
}

/* End of File */