Hvis man f.eks. vil bruke analysedata fra andre programmer eller "massere" en eksisterende CSound-scorefil, må man lese data fra filer. Filen må da åpnes og lukkes, og det er egne funksjoner for å lese ulike typer data.
Eksemplet under leser inn heltall fra en tekstfil og skriver dem ut som noter:
#include <stdio.h>
#include "notelib.h"
void main(void)
{
FILE *fil;
notetype note;
int tall;
note.instrument = 2;
note.starttid = 0.0;
note.varighet = 0.5;
note.styrke = 80;
fil = fopen("filnavn", "r");
while (1) {
fscanf(fil, "%d", &tall);
if (feof(fil)) break;
note.oktav = tall/12+3;
note.pitchklasse = tall%12;
skrivnote(note);
note.starttid += 0.4;
}
fclose(fil);
}
Her var det endel nye ting. FILE *fil deklarerer en variabel som er et "håndtak" til en fil. while (1) betyr at vi skal gå i evig løkke.
Selve innlesingen gjøres med fscanf. "%d" er en formateringskode for heltall, som vi før har sett i forbindelse med printf. &-tegnet før tall vil jeg helst ikke komme inn på, det har å gjøre med pekere, som vi holder oss borte fra i dette kurset. Bare husk å ha den med i fscanf.
feof blir logisk sann når vi har nådd end-of-file, og da hopper vi ut av løkken med break.
På /local/ckurs/dnafil ligger en sekvens på 52173 nukleotider fra menneskets DNA. Det finnes fire ulike nukleotider, som representeres med bokstavene c (cytosin), a (adenin), g (guanin) og t (thymin). Filen er dermed en lang remse med "cagttcgaatgag" osv.
Kan du lage musikk av dette? For å lese inn bokstaver må du bruke en datatype som heter char (character), og formateringskoden %c, f.eks. slik:
char nukle;
...
fscanf(innfil, "%c", &nukle);
if (nukle=='c') {
...
}
...