210 likes | 342 Views
tircms02-p les 4. Preprocessor In- en uitvoer Diversen. Preprocessor. Een preprocessor faciliteit dient om de compiler van te voren te laten manipuleren met tekst voordat het eigenlijk compileren gebeurt. #Define AANTAL 1000 Nu wordt overal voor AANTAL 1000 ingevuld AANTAL heet macro
E N D
tircms02-p les 4 • Preprocessor • In- en uitvoer • Diversen
Preprocessor • Een preprocessor faciliteit dient om de compiler van te voren te laten manipuleren met tekst voordat het eigenlijk compileren gebeurt. • #Define AANTAL 1000 • Nu wordt overal voor AANTAL 1000 ingevuld • AANTAL heet macro • De hele regel heet macrodefinitie • #define identifier string
Preprocessor • Voorbeeld • #define max(a,b) ((a)>(b) ? (a) : (b) ) • statement: • y= 2 * max(i+1 , j-1) +3; • Expansie • y= 2 * ((i+1) > (j-1) ? (i+1) : (j-1)) +3 • Haakjes zijn noodzakelijk • Bij macro wordt de code in-line geplaatst
Preprocessor • Bij een macro wordt de code in-line geplaatst • dwz dat de macrocode in het programma geplaatst wordt • Bij een functie wordt de code 1-malig in programma geplaatst • Voordeel macro : is sneller dan functie • Nadeel macro: het kost meer geheugen
Preprocessor • #include “HULPTEKST” • Nu wordt gezocht naar de file HULPTEKST in onze eigen directory , daarna in systeemdirectories • #include <stdio.h> • #include <math.h> • Nu wordt alleen in de systeemdirectories gezocht • .h zijn headerfiles • #include regels kunnen genest zijn
In-en uitvoer • Printf ( format-string , arg1 , arg 2,..) • formatstring bevat: • karakters, conversiespecificaties • Conversiekarakters: • d,o,x,u,c,s,f,e,g • Tussen % en conversiekarakter: • -teken , veldbreedte , een punt . , precisie , l
Printf • printf(“%-10.6s???%c\n”,”Vreemde dingen”,’!’); • Geeft: • Vreemd ???! • zonder – teken geeft dit • Vreemd???! • De functiewaarde die afgegeven wordt is gelijk aan het aantal overgedragen karakters of negatief bij een foutmelding
Scanf • scanf(formatstring, arg1, arg2, ….); • formatstring bevat: • karakters, conversiespecificaties • Conversiekarakters: • d,o,x,c,s,f • Tussen % en conversiekarakter: • * , de maximale veldbreedte
Scanf • int i,j,k; char str[6] , ch; float x; • scanf(“%c %d %f ++ %3d %2d %*d %s”, &ch , &i, &x, &j, &k ,str); • invoer: q 123 3.14++98765432 abc • geeft: ch =‘q’ , i=123 , x =3.14 , j= 987 , k=65 , str=“abc\0”
Files • #include <stdio.h> • main () • { • FILE *p, *q, *fopen(); • char ch; • p=fopen(“fff”, "r"); • q=fopen(“ggg”, "w"); • while (( ch=getc(p)) !=EOF) putc(ch, q); • }
begin open file fff en ggg Lees kar uit file fff EOF(fff)? ja Schrijf karakter naar file ggg end Flowchart
Files • EOF = -1 ( 16 bit) , eigenlijk checken op integer , maar char gaat in dit geval ook goed • File is een type ( een structure) • in stdio.h staat: • typedef struct { … } FILE; • Er dient een FCB (filecontrol block) te worden gemaakt. • met FILE *p , *q , *fopen(); onstaan pointers naar FCB
Files • Met p = fopen(“fff”,”r”); ontstaat een FCB • ( er wordt een file geopend) • De functiewaarde die fopen aflevert is een pointer naar gecreerde control block • met ch = getc(p) wordt een karakter gelezen uit de file dmv pointer die afgeleverd wordt door fopen • openen voor r,w,a
file pointer file control block file p *p fff q *q ggg werkgeheugen disk Files
Files • ch=getchar() ch=getc(stdin) • putchar(ch) putc(ch, stdout) • fgets(str,maxlen,p) leest 1 regel uit een file • fputs(str,p) schrijft 1 regel naar een file • gets(str) leest een regel van toetsenbord • putst(str) schrijft regel naar beeldscherm
Goto • goto ginds • .... • ginds: x = y +1; • Met exit(0); wordt uit een functie gesprongen en alle files gesloten
Programma-argumenten • #include <stdio.h> • FILE *openen • main(argc, argv) int argc; char *argv[]; • { FILE *pin1, *pin2, *puit , *fopen(); char ch; • if (argc !=4) • { printf(“3 argumenten vereist\n”’; exit(0);} • else • { pin1=openen(argv[1] , “r”); • pin2=openen(argv[2] , “r”); • puit=openen(argv[3] , “w”); • while ((ch=getc(pin1)) !=EOF ) putc(ch,puit); • while ((ch=getc(pin2)) !=EOF ) putc(ch,puit); • }
Programma-argumenten • FILE *openen(pargv, s) char *pargv , *s ; • { FILE *p; • if (( p=fopen(pargv,s)) == NULL) • { printf(“er is een probleem met file • %s\n”, pargv); exit(1); • } • else return (p) • }
Programma-argumenten • argc = argument count • argv = argument vector • op de command-line staat: • kopieer in1 in2 uit • De files in1 en in2 worden achter elkaar naar de file uit geschreven.
Programma-argumenten • Na het intypen geldt: • argc=4 • argv[0] = “kopieer” • argv[1] = “in1” • argv[2] = “in2” • argv[3] = “uit” • Als er geen 3 argumenten zijn of de files niet bestaan wordt een foutmelding gegeven
Huiswerk les4 • Maak de opgaven 10.1-10.2 uit modulewijzer • Maak de opgaven 11.1-11.2 uit modulewijzer • Maak de opgaven 12.1-12.2 uit modulewijzer • Bekijk vast de systemcalls van les 6