#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define DATEIGROESSE 100000L
#define DATEI1 "test.1"
#define DATEI2 "test.2"
#define ZEIT1 time_t t1=time(NULL)
#define ZEIT2 time(NULL)
#define ZEIT3 t1

void oeffne_datei(char *quelle,char *ziel,FILE **read, FILE **write)
{
 if((*read=fopen(quelle,"rb")) == NULL)
  {
   fprintf(stderr,"Fehler beim Oeffnen\n");
   exit (0);
  }
 if((*write=fopen(ziel,"wb")) == NULL)
  {
   fprintf(stderr,"Fehler beim Oeffnen\n");
   exit (1);
  }
}

void kopiere(FILE **quelle,FILE **ziel)
{
 int c;
 while((c=getc(*quelle)) != EOF)
     putc(c,*ziel);
 fclose(*quelle);
 fclose(*ziel);
}

void copy1()
{
 FILE *quell,*ziel;
 ZEIT1;
 printf("Kopiere ohne irgendeine Puffereinstellung mit setbuf\n");

 oeffne_datei(DATEI1,DATEI2,&quell,&ziel);
 kopiere(&quell,&ziel);
 printf("Zeit = %d sec.\n",ZEIT2-ZEIT3);
}

void copy2()
{
 FILE *quell,*ziel;
 static char puffer1[BUFSIZ];
 static char puffer2[BUFSIZ];
 ZEIT1;
 printf("Kopiere gepuffert\n");
 oeffne_datei(DATEI1,DATEI2,&quell,&ziel);

 setbuf(quell,puffer1);
 setbuf(ziel,puffer2);
 kopiere(&quell,&ziel);
 printf("Zeit = %d sec.\n",ZEIT2-ZEIT3);
}

void copy3()
{
 FILE *quell,*ziel;
 ZEIT1;
 printf("Kopiere ungepuffert\n");
 oeffne_datei(DATEI1,DATEI2,&quell,&ziel);

 setbuf(quell,NULL);
 setbuf(ziel,NULL);
 kopiere(&quell,&ziel);
 printf("Zeit = %d sec.\n",ZEIT2-ZEIT3);
}

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();
 copy2();
 copy3();

 remove(DATEI1);
 remove(DATEI2);

 return 0;
}

