/***************************************************************************
 * File:         vb-fileio-1.c
 * Status:       08-mar-2006, pfk.
 *               04-mar-2008, wlm
 *               17-sep-2010, wlm
 *                7-oct-2011, wlm
 * Functie:      Voorbeeld met declareren en gebruik van files.
 * Beschrijving: Een aantal gegevens worden in een outputfile geschreven.
 *               Als de outputfile bestaat, wordt de oude inhoud overschreven.
 *               Als de outputfile niet bestaat, wordt deze gemaakt.
 ***************************************************************************/

#include <stdio.h>
#include <stdlib.h>

#define LEN_FILENAAM    1000        /* maximale lengte van filenaam */
#define LEN_REGEL       1000        /* maximale lengte van tekstregel */

/*=========================================================================*/

int main () {
    FILE  *finp,                    /* file identifier van inputfile */
    *fout;                          /* file identifier van outputfile */
    char  filnam[LEN_FILENAAM];     /* naam van input- en outputfile */
    char  line [LEN_FILENAAM];
    char  *tekstregel;              /* om tekst uit file in te lezen */
    int   var1=3, var2=2;           /* integer hulpvariabelen */
    float var3;                     /* float hulpvariabele */

    /* Vraag de filenaam. */

    printf ("\nGeef naam van outputfile: ");
    scanf  ("%s", filnam);
    /* NB: er staat hier geen "&" voor de parameter "filnam", omdat dit al
           een pointer is, namelijk naar het eerste array-element */

    /* Open outputfile.
       Om een file te kunnen gebruiken, moet de file geopend worden, d.w.z.
       - de locatie van de file op schijf wordt aangegeven (filenaam),
       - het soort toegang ("access mode") wordt aangegeven
         (r=read, w=write, a=append),
       - een "file pointer" wordt gekoppeld aan de file,
       - door middel van de "file pointer" is de file toegankelijk. */

    if ( (fout = fopen (filnam, "w")) == NULL ) {
        printf ("Output file '%s' kan niet geopend worden!\n", filnam);
        return (1);
    }

    /* Schrijf in outputfile. */

    fprintf (fout, "Eerste regel in file.\n");
    fprintf (fout, "Aantal gehele waarden: %d, %d.\n", var1, var2);
    fprintf (fout, "  Integer quotient: %d\n", var1%var2);

    /* Forceer dat de waarden van de variabelen "var1" en "var2" eerst naar
       float omgezet worden voordat er gedeeld wordt. */
    var3 = (float) var1 / (float) var2;
    fprintf (fout, "  Float quotient:   %f\n", var3);

    /* Sluit outputfile. */

    fclose (fout);

//  Test demo niet bestaand file
//  sprintf(line,"del %s",filnam);
//  system(line);

    /* Open de gemaakte file als inputfile. */

    if ( (finp = fopen (filnam, "r")) == NULL ) {
        printf ("File '%s' bestaat niet!\n", filnam);
        return (1);
    }

    /* Lees inputfile en geef de inhoud weer op het scherm. */

    printf ("\nInhoud van file \"%s\":\n\n", filnam);

    /* Alloceer ruimte voor tekst in pointervariabele "tekstregel". */
    tekstregel = (char *) malloc (LEN_REGEL*sizeof(char));
    if ( tekstregel == NULL) {
        fprintf(stderr,"Alloceren geheugen voor tekstregel is niet gelukt \n");
        exit(0);
    }
    /* While-loop om regel voor regel uit de file te lezen.
       De conditie van de while bevat twee instructies, die gescheiden zijn
       door een komma:
       1. lees een tekstregel uit de file,
       2. test of bij het lezen einde-van-file (= end-of-file = EOF) bereikt is
          en neem daar de logische ontkenning van (het uitroepteken).
       Het resultaat van de laatste instructie bepaalt de uitkomst van de
       conditie. */
    /* Functie "fgets" wordt gebruikt om een volledige tekstregel uit een
       file te lezen. */
    while ( fgets (tekstregel, LEN_REGEL, finp), !feof(finp) )
        printf ("%s", tekstregel);

    printf ("\n");

    /* Sluit inputfile. */

    fclose (finp);

    return (0);
}
