title: copy a file using c language system calls
body: <p>I'm exploring system calls in c programming language and trying out some examples on copying a file. I am running into issues where I have an original text file containing a single line "The quick brown fox..." to be copied and then the result contains data that is not intended to be there.  Any ideas or tips I should know on how to fix this?</p>
  
  <p>When I tried to run the code example ./copy sample.txt new_sample.txt (<em>similar to <strong>cp</strong> command</em>) I get this ouput on the terminal:</p>
  
  <pre><code>$./copy sample.txt new_sample.txt
  argv[0] = ./copy
  argv[1] = sample.txt
  argv[2] = new_sample.txt
  ERROR: couldn't write whole buffer
  Segmentation fault: 11
  $
  </code></pre>
  
  <p>given that there's an error on the terminal there is a file created named new_sample.txt opening it using vim editor reveals this result.</p>
  
  <blockquote>
    <p>The quick brown fox jumps over the lazy dog.
    ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@à¯¾dÿ^?^@^@^@^@¾dÿ^?^@^@&lt;9b>¿¾dÿ^?^@^@Àú½dÿ^?^@^@^_ã¾dÿ^?^@^@@ü½dÿ^?^@^@&lt;90>û½dÿ^?^@^@@û½dÿ^?^@^@^Z^S¾dÿ^?^@^@^@^@^@^@^@^@^@^@^@^@þ^D^A^@^@^@À^E¾dÿ^?^@^@^@^@^@^@ÿ^?^@^@
    ^G¾dÿ^?^@^@0^G¾dÿ^?^@^@^@^@^@^@^C^@^@^@pû½dÿ^?^@^@×^Eä¦÷[&lt;87>´^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@</p>
  </blockquote>
  
  <p>here's an example code i have: (filename: copy.c)</p>
  
  <pre><code>#include &lt;sys/stat.h&gt;
  #include &lt;fcntl.h&gt;
  #include "tlpi_hdr.h" /* contains stdlib, sys/types, stdio.h, unistd, error, string.h */
  
  #ifndef BUF_SIZE /* Allow "cc -D" to override definition */
  #define BUF_SIZE 1024
  #endif
  
  int main(int argc, char *argv[])
  {
      int inputFd;
      int outputFd;
      int openFlags;
      mode_t filePerms;
      ssize_t numRead;
      char buf[BUF_SIZE];
  
      /* check for the inputs */
      int arg_count=0;
      for (arg_count; arg_count &lt; argc; arg_count++)
          printf("argv[%d] = %s\n", arg_count, argv[arg_count]);
  
      if (argc != 3 || strcmp(argv[1], "--help") == 0)
          usageErr("%s old-file new-file\n", argv[0]);
  
      /* open input and outpu files */
      inputFd = open(argv[1], O_RDONLY);
      if (inputFd == -1)
          errExit("opening file %s", argv);
  
      openFlags = O_CREAT | O_WRONLY | O_TRUNC;
      filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; /*rw-rw-rw*/
  
      outputFd = open(argv[2], openFlags, filePerms);
  
      if (outputFd == -1)
          errExit("opening file %s", argv[2]);
  
      /* transfer data until we encounter end of input or an error */
  
      while ((numRead = read(inputFd, buf, BUF_SIZE)) &gt; 0)
      {
          if (write(outputFd, buf, BUF_SIZE) != numRead)
              fatal("couldn't write whole buffer");
      }
  
      if (numRead == -1)
          errExit("read");
  
      if (close(inputFd) == -1)
          errExit("close input");
      if (close(outputFd) == -1)
          errExit("close output");
  
      exit(EXIT_SUCCESS);
  }
  </code></pre>