Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

Hoofdstuk 6 Programmeren in Pascal

6.6 Werken met bestanden.

  6.6.1 De write- en read-opdracht.

Als er een bepaalde tekst op het scherm moet verschijnen, dan geet je de opdracht WRITE(woord); of WRITELN(woord);
(dan wordt de inhoud van de variabele woord op het scherm afgedrukt.)

Als je wilt dat er iets op het papier wordt afgedrukt dan geef je bijv. de opdracht WRITE(lst,woord); of WRITELN(lst,woord);
(dan wordt de inhoud van de variabele woord op papier afgedrukt.)

Als je wilt dat de inhoud van de variabele woord op schijf wordt gezet, dan moet je bijvoorbeeld de opdracht WRITELN(f, woord) geven.
Maar dat werkt alleen als je van tevoren al een aantal dingen geregeld hebt. Daarover, en over de betekenis van die f na write, lees je hieronder meer.
Als je een woord van de schijf wilt inlezen dan geef je de opdracht READLN(f, woord);

  6.6.2 De declaratie

Als je bijvoorbeeld een woordjes-overhoor-programma wilt maken, en je wilt dat de woorden met de vertaling, die je intypt, op schijf worden bewaard, dan moet je eerst iets declareren.
Er wordt dan ruimte in het werkgeheugen gereserveerd, een zogenaamde buffer.
Want als je de opdracht write(f,woord); geeft dan wordt de inhoud van de variabele woord niet direkt op de schijf gezet. Eerst wordt het in het werkgeheugen bewaard, dus in de buffer.
En als die buffer, die bijvoorbeeld uit 1024 tekens kan bestaan, vol is, dan wordt de hele inhoud daarvan op de schijf gezet.
De naam van die file-buffer kan van alles zijn, maar vaak wordt daar de letter f van file (Engels voor "bestand") voor gebruikt.
Als je allemaal gehele getallen wilt opslaan dan declareer je bijvoorbeeld: VAR f: file of integer;
Als je allemaal komma-getallen wilt bewaren dan declareer je bijvoorbeeld: VAR f: file of real;
Als je allemaal woorden op schijf wilt zetten, of woorden en getallen door elkaar, dan declareer je: VAR f: text;
(denk er om: niet file of text !!)

  6.6.3 De naam van het bestand.

Als je iets (een "bestand") op schijf bewaart, dan moet dat bestand een naam hebben van maximaal 8 tekens. Met eventueel nog een toevoeging van een punt en daarna nog drie tekens, de zogenaamde "extensie".
(Pascal-programma's werken onder DOS, vandaar dat de naam maar uit 8 tekens mag bestaan, en er mogen geen spaties in de naam voorkomen!)

Je zou het bestand met woorden voor een woordjes-overhoor-programma bijvoorbeeld WOORDEN.DAT kunnen noemen. Daarvoor gebruik je de opdracht ASSIGN(f,'woorden.dat');
Als naam van het bestand zou je ook zoiets als E:WOORDEN.DAT kunnen geven; dan wordt het op de E-drive (misschien een USB-stick?) gezet onder de naam WOORDEN.DAT. Of zoiets als C:\TAAL\WOORDEN.DAT. Dan wordt het op de harde schijf gezet in de map TAAL onder de naam WOORDEN.DAT.
C:\TAAL of E: wordt in dat geval wel het "pad" van de gegevens genoemd.
Als je geen pad opgeeft, dan wordt het in de actieve map gezet; dat is meestal de map waarin het programma staat.

  6.6.4 De leeswijzer en schrijfwijzer.

De computer houdt bij waar hij aan toe is met het inlezen of wegschrijven.
Elke keer als er een woord is ingelezen wordt de 'leeswijzer' op het begin van het volgende woord gezet, zodat bij het inlezen van een nieuw woord het juiste woord wordt aangewezen om in te lezen.
In het begin moet die leeswijzer op het eerste woord van het bestand worden gezet. Dat gebeurt niet automatisch, daar moet je een opdracht voor geven.
En die opdracht luidt: RESET(f);
Ben je van plan woorden naar de schijf weg te schrijven, dan moet de schrijfwijzer aan het begin worden gezet, en de opdracht daarvoor is: REWRITE(f);

Bij de opdracht READLN(f,woord); wordt er trouwens niet één woord ingelezen, maar een hele zin. Hoewel die zin toevallig uit één woord kan bestaan.
En de leeswijzer wordt dan aan het begin van de volgende zin gezet.
Als de variabele TEKEN van het type CHAR is, dan wordt er bij de opdracht READ(f,teken) maar één teken ingelezen!

  6.6.5 Een bestand afsluiten.

Nadat er een aantal woorden naar de schijf zijn geschreven m.b.v. de opdracht WRITELN(f,woord); moet er nog een opdracht worden gegeven om het bestand "af te sluiten", en die opdracht luidt: CLOSE(f);
Dan wordt de buffer, die dan waarschijnlijk niet precies vol is, nog naar de schijf weggeschreven. En er wordt nog een speciaal teken achter het laatste woord op de schijf gezet, het zogenaamde end-of-file teken (afkorting: eof), zodat de computer weet dat alles wat daarachter staat op de schijf niet meer bij het bestand hoort.
Daar wordt ook vaak gebruik van gemaakt bij het inlezen van de woorden uit een bestand. Dan moet er net zo lang door worden gegaan met inlezen van woorden tot het eof-teken is bereikt.
Zolang dat teken niet is bereikt is de boolese variabele EOF(f) false, en zodra het wel bereikt is is die variabele true. (die variabele hoeft niet te worden gedeclareerd, hij is standaard aanwezig).
Niet alleen bij het wegschrijven van woorden naar de schijf, ook bij het inlezen van schijf moet aan het eind de opdracht CLOSE(f); worden gegeven.

  6.6.6 Het programma om woordjes naar schijf te schrijven.

De opdrachten, die hiervoor zijn besproken, komen allemaal voor in het volgende programma.
Probeer het maar eens uit, en probeer te begrijpen wat er gebeurt aan de hand van de opmerkingen tussen de programmaregels (de groene regels, tussen accolades)

PROGRAM schrijf; 
var naam,woord:string;
    {declaratie van de file:}
    f:text; 
BEGIN 
CLRSCR; 
WRITELN("Geef de naam waaronder de woordjes bewaard moeten worden"); 
READLN(naam);
{het bestand met de ingevoerde naam wordt aangemaakt}
ASSIGN(f,naam); 
{de schrijfwijzer wordt aan het begin van het bestand gezet}
REWRITE(f); 
WRITELN("Typ de woorden in. S = stoppen");
REPEAT 
   WRITE("Nederlands: ");
   READLN(woord); 
   IF ((woord<>"S") and (woord<>"s")) THEN 
   BEGIN 
      {het woord wordt aan het bestand toegevoegd}
      WRITELN(f,woord); 
      WRITE("Vertaling: ");
      READLN(woord);
      {de vertaling wordt aan het bestand toegevoegd}
      WRITELN(f,woord); 
   END
   {dit wordt herhaald zolang er geen S als woord is ingevoerd}
until ((woord='S') or (woord='s')); 
{het bestand wordt afgesloten}
CLOSE(f); 
END.

En als je dit programma runt, dan kun je het volgende te zien krijgen:



Als je dan met de Verkenner controleert of het bestand wel bestaat, dan zal het in de aangegeven map staan.
En dan kun je het bijvoorbeeld openen met Kladblok om te kijken wat er in staat:

  6.6.7 Het programma om woordjes van schijf in te lezen.

Als je het programma uit de vorige paragraaf hebt uitgeprobeerd, dan is er een bestand met woordjes aangemaakt. Die woordjes kun je ook weer inlezen, dat gebeurt in het volgende programma.
Probeer het maar eens uit, en probeer weer te begrijpen wat er gebeurt aan de hand van de opmerkingen tussen de programmaregels (de groene regels, tussen accolades)

PROGRAM lees; 
VAR naam,woord:STRING;
    nedwoord, vreemdwoord:ARRAY[1..100] of STRING; 
    i, aantal:INTEGER;
    {declaratie van de file:}
    f:TEXT; 
BEGIN 
CLRSCR; 
WRITELN("Geef de naam van het woordjesbestand"); 
READLN(naam);
{het bestand met de ingevoerde naam wordt opgezocht}
ASSIGN(f,naam); 
{de leeswijzer wordt aan het begin van het bestand gezet}
RESET(f);
i:=0; 
REPEAT 
   i:=i+1;
   {het eerstvolgende nederlandse woord wordt ingelezen}
   READLN(f,nedwoord[i]); 
   {het ned. woord wordt op het scherm afgedrukt}
   WRITELN("Nederlands: ",nedwoord[i]); 
   {het eerstvolgende woord, dat is de vertaling, wordt ingelezen}
   READLN(f,vreemdwoord[i]); 
   {de vertaling wordt op het scherm afgedrukt}
   WRITELN("Vertaling: ",vreemdwoord[i]); 
   {dit wordt herhaald net zolang tot het einde bereikt is} 
UNTIL (EOF(f));
aantal:=i;
{het bestand wordt afgesloten}
CLOSE(f); 
END.

En als je dit programma runt, dan kun je het volgende te zien krijgen:



Opgaven.
Maak nu opgave 17 van hoofdstuk 6 (Pascal)