next up previous contents
Next: Lydbehandling Up: C-programmering for musikere Previous: Funksjonertabeller, datastrukturer

Filbehandling

Innlesing av filer

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.

Eksempel 7: Innlesing av tall

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.

Oppgave

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



\yvind Hammer
Tue Oct 1 17:56:30 MDT 1996