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') { ... } ...