F5: Filhantering in- och utmatning (kap. 2 och 8) 1 Utskrift på skärm, inläsning från tangentbord (kap. 2) Spara och hämta variabler med save och load (kap. 2) Kommandot textread Mer avancerad filhantering: Användning av filreferenser, öppna, stänga, filslut Binär skrivning och läsning med filreferens Formatkoder och specialtecken Skrivning och läsning med formatstyrning Direktfiler Utskrift på skärm, inläsning från tangentbord 2 Det finns många sätt att skriva ut och läsa in data. Kommandon för utskrift på skärmen: Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut disp(uttryck) uttryckets värde utan variabelnamn skrivs ut - fprintf(formatsträng,uttryck, ) hur uttryckens värden skrivs styrs av formatkoder m.m. i formatsträngen Inläsning från tangentbordet: - input(ledtext) skriver ut strängen ledtext. Kommandot returnerar svaret - input(ledtext,'str') skriver ut strängen ledtext. Svaret lagras som en sträng i str
Ex: Tabell på skärmen Skriv en tabell med rätvinkliga trianglar med heltalssidor <= 100. 3 fprintf('\n a b c\n'); for c=1:100 c2 = c^2; for a=1:floor(sqrt(c2/2)) a2 = a^2; b = round(sqrt(c2-a2)); if a2+b^2==c2 fprintf('%5d%5d%5d\n',a,b,c); Filhantering 4 En datafil är en samling data (information) som är lagrad under ett speciellt namn. Data kan skrivas till och läsas från filer på två olika sätt: Oftast lagras filer i form av text, s.k. formatterad in- och utmatning. Innehållet omvandlas då till tecken som kan läsas direkt av användaren. Ibland vill man kunna lagra data binärt, på exakt samma form och med samma bitmönster som data lagras i primärminnet. Läsningen och skrivningen är mycket effektiv, men en användare kan inte läsa innehållet
Spara variabler med save Man kan spara sina variabler i filer som är gjorda för MATLAB med följande kommandon: 5 save filnamn spara alla variabler i workspace (eller angivna variabler) binärt på filen filnamn.mat save filnamn v spara värden i variabeln v binärt på filen filnamn.mat Ex: v = [1 2 3 4]; save vektor v; save filnamn v -ascii-double spara värden i variabeln v som text i ASCII-format på filen filnamn.mat i dubbel precision med 16 siffror Hämta variabler medload 6 Man kan hämta variabler från filer skapade i tidigare MATLABsessioner med följande kommandon: load filnamn Hämta alla variabler från filnamn.mat binärt Ex: load vektor.mat; hämtar alla variabler i den binära filen vektor.mat load filnamn [variabellista] Hämta alla variabler (eller angivna) från filnamn.mat binärt load filnamn.suffix [variabellista] [-ascii -mat] alla variabler (eller angivna) från filnamn.suffix värdena läses normalt binärt, med -ascii eller med suffix annat än mat läses alla data till variabeln filnamn (då används ej variabellistan) från filen som text
Användning av MATLAB med andra program 7 Möjligheten att använda MATLAB med andra program är maskinberoe Det är möjligt att läsa och skriva filer skapade med andra program på blankteckenseparerat ASCII-format, t.ex. Excels, Lotus 123 formulärformat WK1 eller ASCIIkalkylbladformat Verktyget Import Wizard underlättar inläsning av många filformat, t ex kalkylblad, binära filer, textoch grafikfiler Kommandottextread 8 Läs i boken och hjälpinformationen om filhantering. textread läser numeriska data från en textfil. Man kan även läsa in till flera variabler. Syntax: [a,b,c,...] = textread('filename','format') [a,b,c,...] = textread('filename','format',n) [...] = textread(...,'param','value',...) 'format' är en formatsträng som innehåller en beskrivning av datatypen i varje kolumn (se bild 12) Ex. A = textread( blah.txt, %u%u );
Öppna och stänga filer med filreferenser (file id) Vi öppnar filen med funktionen fopen Om det går bra får vi en filreferens, s.k. fileid som kan användas för att identifiera filen och var man jobbar i den. (om det uppstod något fel returneras värdet -1). filreferens = fopen(filnamn,op) Strängen op bestämmer vilka typer av operationer som kan utföras på filen och kan anta värdena: 'r' ast läsning 'r+' läsning och skrivning 'w' skriv över gammal eller skapa ny. Endast skrivning 'w+'skriv över gammal eller skapa ny. Skrivning och läsning 'a' (app) skriv i slutet av gammal fil. Endast skrivning 'a+' skriv i slutet av gammal fil. Endast skrivning och läsning 9 fclose(filreferens) Stänger filen specificerad av filreferens. Om det går bra returneras 0 annars 1. feof(filreferens) Returnerar 1 om slutet på filen har nåtts annars returneras 0 Binär skrivning och läsning 10 Det kan ibland vara nödvändigt att använda binära filer i MATLAB Om man har ett annat program som skapar filer i ett speciellt format eller kräver filer i ett speciellt format Kommandona save och load kan inte påverka exakt hur variablerna ska lagras Binär skrivning : fwrite(filreferens,uttryck,prec) skriver uttrycket kolonnvis till filen. Funktionen returnerar antalet skrivna element. prec bestämmer med vilken precision elementen ska sparas, kan vara 'char', 'int16', 'float32' m.m. Binär läsning: [variabel,antal] = fread(filreferens,storlek,precision) returnerar data från filen till matrisen variabel. antal är antalet element som lästes utan fel, storlek är ett tal, inf eller [m n] och precision som ovan
Skrivning och läsning av formatterade textfiler Skrivning till textfil med filreferens: fprintf(filreferens,formatsträng,uttryck, ) skriver de data som ges av uttryck, till filen på formatet enligt formatsträng Läsning från textfil med filreferens: variabel = fscanf(filreferens,formatsträng,storlek) läser in data från filen till variabel, formatsträng anger formatet på de data som läses in. storlek anger hur många element som ska läsas [variabel,antal] = fscanf(filreferens,formatsträng,storlek) fungerar på samma sätt som ovan, men i antal returneras antal inlästa element rad = fgetl(filreferens) läser nästa rad i filen, om filen står vid radslut returneras -1 rad = fgets(filreferens) returnerar en sträng som innehåller nästa rad i filen, inklusive -of-line-tecken, om filen står vid radslut returneras -1 11 Formatkoder i formatsträngar 12 En formatsträng till kommandona fprintf oxh fscanf består av formatkoder, specialtecken och annan text. En formatkod har formen: %[ + 0][#.#]F. Markören % och formatkonverteraren F måste ingå, hakparanteserna anger att tecknen kan utelämnas - vänsterställ + sätt alltid ut tecken 0 fyll ut med inledande nollor #.totalt antal tecken.#antal siffror /antal decimaler Formatkonverterare: c ett tecken d decimalt heltal e exponentform med e E exponentform med E f decimalbråk s teckensträng u decimalt heltal utan tecken
Specialtecken i formatsträngar Specialtecken är: \n (ny rad) \t (tabulatortecken) \b (backsteg) \f (ny sida) \r (början av raden) \' eller '' (skriv apostrof, ') \\ (skriv inverterat snedstreck) Uttrycken i formatsträngen paras ihop med formatkoderna med början från vänster. 13 Om formatsträngen tar slut innan uttrycken används den från början igen. Om uttrycken tar slut innan formatsträngen används formatsträngen fram till nästa formatkod eller till sitt slut. Specialtecken och annan text och skrivs ut resp. matchas mot tecknen i filen. Ex: Läs, lagra och skriv en textfil 14 fr = fopen('findgear.m','r') fr = 3 t = fscanf(fr,'%c',inf); %läs till slutet av filen disp(t); function [m,n,finalgear] = findgear(gear,min,max)... whos t Name Size Bytes Class t 1x865 1730 char array
Läs in till en nx3 numerisk matris från textfil type t.dat 1 2 3 4 5 6 7 8 9 10 fr = fopen('t.dat','r') fr = 3 t = fscanf(fr,'%d',inf); size(t) ans = [10 1] 15 % Konvertera till nx3 numerisk matris % och fyll sista raden t = reshape([t; zeros(mod(-numel(t),3))],3,[])' % mod([-12-11 -10],3) är [0 1 2] t = 1 2 3 4 5 6 7 8 9 10 0 0 Dialogrutor, felmeddelanden och numeriska data 16 Med uigetfile och uisetfile kan man öppna dialogrutor för att välja in- och utfil. Man bör kontrollera om läsning och skrivning gick bra: [felmed,felnr] = ferror(filreferens); if felnr~=0 disp(felmed);
Direktfiler Programmet kan styra var i filen läsning/skrivning ska ske: frewind(filreferens) sätter aktuell position till filbörjanftell(filreferens) ger aktuell position i byte från filbörjan fseek(filreferens,pos,origo) sätter aktuell position till pos byte efter origo, origo 1 betyder filbörjan, 0 betyder aktuell position, 1 betyder filslut 17