155GIT1 / 3. cvičení

Z GeoWikiCZ

Textové řetězce, workspace, čtení a zápis matic z/do textových souborů

Náplň cvičení

  1. textové řetězce
  2. datové typy • class()
  3. workspace • whossave, load, clear
    • manipulace se soubory viz [1]delete
  4. zápis matice do textového souboru
  5. formátování výstupu
  6. čtení dat z textového souboru do matice (ke stažení vstup.txt)

Ukázky

Řetězce

 t = 'ahoj, svete!'
 t(7)
 t(7:end)
 t(7:end-1)

Datové typy

 class(t)
 A = [1 2; 3 4]
 class(A)
 class(1)
 class(2.3)

Formátovaný zápis matice

 A = 10 * rand(3,4);
 fid = fopen('a.txt','w');
 fprintf(fid,'%f %f %f %f\n',A);
 fclose(fid);  % zápis je proveden až při uzavření souboru
 type a.txt
 5.272319 3.702292 6.948680 6.032164     % ve výpisu matice nesprávné pořadí prvků
 9.547577 8.851383 4.710683 9.105915 
 7.628851 3.489846 4.923848 6.733618

 % správný výpis matice (správný rozměr a pořadí prvků)
 fid = fopen('a1.txt','w');
 fprintf(fid,'%f %f %f %f\n',A');
 fclose(fid);
 type a1.txt 
 5.272319 6.032164 4.710683 3.489846
 3.702292 9.547577 9.105915 4.923848
 6.948680 8.851383 7.628851 6.733618

 % změna dimenze matice při zápisu
 fid = fopen('a2.txt','w');
 fprintf(fid,'%f %f %f\n',A');
 fclose(fid);
 type a2.txt 
 5.272319 6.032164 4.710683     % nejde o transpozici !!!
 3.489846 3.702292 9.547577
 9.105915 4.923848 6.948680
 8.851383 7.628851 6.733618

 % změna formátování
 fid = fopen('a3.txt','w');
 fprintf(fid,'%.1f %.1f %.1f %.1f\n',A');
 fclose(fid);
 type a3.txt
 5.3 6.0 4.7 3.5
 3.7 9.5 9.1 4.9
 6.9 8.9 7.6 6.7

 % zápis dat do již existujícího souboru
 fid = fopen('a1.txt','a');
 fprintf(fid,'%f %f %f %f\n',A(1,:));  % totožné s fprintf(fid,'%f %f %f %f\n',A(1,:)');, neboť se vypisuje vektor
 fclose(fid);
 type a1.txt
 5.272319 6.032164 4.710683 3.489846
 3.702292 9.547577 9.105915 4.923848
 6.948680 8.851383 7.628851 6.733618
 5.272319 6.032164 4.710683 3.489846
 % výpis na standardní výstup (příkazové okno)
 n = 1:3;
 alfa = [45.24 -349.15 1.75];
 fprintf('pro n = %i je uhel = %7.2f°\n',[n; alfa]);

Formátování dat obecně

 fprintf('%s: %i\n', 'moje nahodne cislo (1 az 100)', randi(100))
 moje nahodne cislo (1 az 100): 31

 % uložení do řetězce
 r = sprintf('%s: %i\n', 'moje nahodne cislo (1 az 100)', randi(100))
 class(r)
 ans = char

 % příklad formátování dvou řádkových vektorů 
 a = 1:10
 fprintf('a: %.2d -> a^2: %.3d\n', [a; a.^2])
 a: 01 -> a^2: 001
 a: 02 -> a^2: 004
 a: 03 -> a^2: 009
 a: 04 -> a^2: 016
 a: 05 -> a^2: 025
 a: 06 -> a^2: 036
 a: 07 -> a^2: 049
 a: 08 -> a^2: 064
 a: 09 -> a^2: 081
 a: 10 -> a^2: 100

 fprintf('a: %2d -> a^2: %3d\n', [a; a.^2])
 a:  1 -> a^2:   1
 a:  2 -> a^2:   4
 a:  3 -> a^2:   9
 a:  4 -> a^2:  16
 a:  5 -> a^2:  25
 a:  6 -> a^2:  36
 a:  7 -> a^2:  49
 a:  8 -> a^2:  64
 a:  9 -> a^2:  81
 a: 10 -> a^2: 100

Načtení dat z textového souboru

 pwd
 f = fopen('vstup.txt')
 x = fscanf(f,'%f ',[2,inf]);
 fclose(f)

Formátované čtení matice

A = magic(5)
f = fopen('m.txt', 'w');
# uložení jako sloupcový vektor
fprintf(f, '%f\n', A);
fclose(f);
type m.txt 
# znovunačtení do dimenze [5x5]
f = fopen('m.txt', 'r');
B = fscanf(f, '%f', [5, inf])
#
# čtení z řetězce
s = sscanf('10.2 5.222', '%f %f')
#
# přeskakování položek
s = sscanf('10.2 5.222 4.2', '%f %*f %f')
fclose(f);

Změna polohy kurzoru v souboru

f = fopen('s.txt', 'w+')
fprintf(f, '%f\n', [1 2; 3 4]) 
fclose(f)
type s.txt
1.000000
3.000000
2.000000
4.000000
#
f = fopen('s.txt')
a = fscanf(f, '%f', [1, inf])
b = fscanf(f, '%f', [2, inf])
fseek(f, 0, 'bof');
b = fscanf(f, '%f', [2, inf])


Úlohy