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 / na standardní výstup
  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

(zápis do souboru)

 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 je 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 (transponovaný zápis)
 fid = fopen('a2.txt','w');
 fprintf(fid,'%f %f %f\n',A);
 fclose(fid);
 type a2.txt 
 5.272319 3.702292 6.948680
 6.032164 9.547577 8.851383
 4.710683 9.105915 7.628851
 3.489846 4.923848 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

(zápis na standardní výstup - příkazové okno)

 n = 8:10;  alfa = [45.246 -349.154 1.750];
 fprintf('pro bod %2.f je uhel = %7.2f°\n',[n; alfa]);

Formátování dat obecně

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

 % uložení do řetězce
 r = sprintf('%s (1 az %i): %i\n',tt,n,randi(n))
 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

Formátované čtení dat

(čtení z textového souboru)

 pwd

 fid = fopen('vstup.txt');
 xx = fscanf(fid,'%f',[2,inf]);
 x = xx';    % pro shodné rozměry matice jako v datovém souboru
 fclose(fid);

(č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')

Změna polohy kurzoru v souboru

 fid = fopen('s.txt','w+');
 fprintf(fid,'%f\n',[1 2; 3 4]);
 fclose(fid);
 type s.txt
 1.000000
 3.000000
 2.000000
 4.000000

 fid = fopen('s.txt');
 a = fscanf(fid,'%f',[1, inf])
 b = fscanf(fid,'%f',[2, inf])  % kurzor je již na konci datového souboru s.txt
 fseek(fid,0,'bof');            % totožně fseek(fid,0,-1);
 b = fscanf(fid,'%f',[2, inf])
 fclose all;

Úlohy