#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define DATEIGROESSE 1000000L
#define DATEI1 "test.1"
#define DATEI2 "test.2"

void copy1(char *quelle, char *ziel)
{
 FILE *q,*z;
 int c;
 time_t t1 = time(NULL);
 printf("Kopiere ohne irgendeine Puffereinstellung mit setbuf\n");

 if((q=fopen(quelle,"rb")) != NULL)
  {
   if((z=fopen(ziel,"wb")) == NULL)
    {
     fprintf(stderr,"Fehler beim oeffnen von %s\n",ziel);
     exit (0);
    }
  }
 else
  {
   fprintf(stderr,"Fehler beim oeffnen von %s\n",quelle);
   exit (1);
  }

 while((c=getc(q)) != EOF)
    putc(c,z);

 fclose(q);
 fclose(z);
 printf("Zeit = %d sec.\n",time(NULL)-t1);
}

void copy2(char *quelle, char *ziel)
{
 FILE *q,*z;
 static char puffer1[BUFSIZ];
 static char puffer2[BUFSIZ];
 int c;
 time_t t1 = time(NULL);

 printf("Kopiere gepuffert\n");

 if((q=fopen(quelle,"rb")) != NULL)
  {
   if((z=fopen(ziel,"wb")) == NULL)
    {
     fprintf(stderr,"Fehler beim oeffnen von %s\n",ziel);
     exit (0);
    }
  }
 else
 {
  fprintf(stderr,"Fehler beim oeffnen von %s\n",quelle);
  exit (1);
  }

 setbuf(q,puffer1);
 setbuf(z,puffer2);

 while((c=getc(q)) != EOF)
     putc(c,z);

 fclose(q);
 fclose(z);
 printf("Zeit = %d sec.\n",time(NULL)-t1);
}

void copy3(char *quelle, char *ziel)
{
 FILE *q,*z;
 int c;
 time_t t1 = time(NULL);

 printf("Kopiere ungepuffert\n");

 if((q=fopen(quelle,"rb")) != NULL)
  {
   if((z=fopen(ziel,"wb")) == NULL)
    {
     fprintf(stderr,"Fehler beim oeffnen von %s\n",ziel);
     exit (0);
    }
  }
 else
  {
   fprintf(stderr,"Fehler beim oeffnen von %s\n",quelle);
   exit (1);
  }

 setbuf(q,NULL);
 setbuf(z,NULL);

 while((c=getc(q)) != EOF)
    putc(c,z);

 fclose(q);
 fclose(z);
 printf("Zeit = %d sec.\n",time(NULL)-t1);
}

void erzeuge_datei()
{
 FILE *create;

 if((create=fopen(DATEI1,"wb")) == NULL)
  {
   fprintf(stderr,"Konnte keine Datei erzeugen\n");
   exit (2);
  }
 fseek(create,DATEIGROESSE-1,SEEK_SET);
 putc('x',create);
 fclose(create);
}

int main()
{
 printf("Datei %s wird erzeugt\n",DATEI1);
 erzeuge_datei();
 copy1(DATEI1,DATEI2);
 copy2(DATEI1,DATEI2);
 copy3(DATEI1,DATEI2);

 remove(DATEI1);
 remove(DATEI2);

 return 0;
}

