155GIT1 / 4. cvičení: Porovnání verzí

Z GeoWikiCZ
Holesovsky (diskuse | příspěvky)
mBez shrnutí editace
 
(Není zobrazeno 44 mezilehlých verzí od 3 dalších uživatelů.)
Řádek 1: Řádek 1:
{{Geoinformatika}}
{{Geoinformatika}}
{{upravit}}
{{Cvičení|155GIT1|4|Čtení formátovaných dat z textových souborů}}
{{Cvičení|155GIT1|4|Čtení a zápis textových souborů}}


== Náplň cvičení ==
== Náplň ==


# opakování - workspace
# čtení dat z textového souboru do matice (ke stažení [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk1.txt pr4uk1.txt], [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk2.txt pr4uk2.txt], [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk3.txt pr4uk3.txt], [http://athena.fsv.cvut.cz:8000/GIT1/cv4/pr4uk4.txt pr4uk4.txt])
# zápis matice do textového souboru
# formátování výstupu
# čtení matice z textového souboru


== Ukázky ==
== Ukázky ==


=== Formátovaný zápis matice ===
=== Formátované čtení dat ===
 
''(čtení z textového souboru)''


<source lang=octave>
<source lang=octave>
A = rand(3,4) * 10;
fid = fopen('pr4uk1.txt','r');
f = fopen('a.txt', 'w');
bxy = fscanf(fid,'%f',[3 inf]);
fprintf(f, '%f %f %f %f\n', A);
bxy = bxy'                   % pro shodné rozměry matice jako v datovém souboru
fclose(f); # zápis je proveden až při uzavření souboru
fclose(fid);
type a.txt
 
5.272319 6.032164 4.710683 3.489846
% přeskakování položek
3.702292 9.547577 9.105915 4.923848
fid = fopen('pr4uk1.txt','r');
6.948680 8.851383 7.628851 6.733618
xy = fscanf(fid,'%*f %f %f',[2 inf]);
#
xy = xy'
# změna dimenze matice při zápisu
fclose(fid);
f = fopen('a1.txt', 'w');
fprintf(f, '%f %f %f\n', A);
fclose(f);
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 formátování
f = fopen('a2.txt', 'w');
fprintf(f, '%.1f %.1f %.1f %.1f\n', A);
fclose(f);
type a2.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
f = fopen('a.txt', 'a')ů
fprintf(f, '%f %f %f %f\n', A(1,:));
fclose(f);
type a.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 3.489846 9.105915 8.851383
</source>
</source>


=== Formátování dat obecně ===
''(čtení z řetězce / z textové proměnné)''
 
* viz [http://geo.fsv.cvut.cz/user/gin/git1/matlab/matlab.pdf#41 formátovací položky]


<source lang=octave>
<source lang=octave>
fprintf('%s: %i\n', 'moje nahodne cislo (1 az 100)', randi(100))
s = sscanf('10.2 5.222','%f')
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
</source>
</source>


=== Formátované čtení matice ===
''(čtení textových souborů s hlavičkou)''


<source lang=octave>
<source lang=octave>
A = magic(5)
fid = fopen('pr4uk2.txt','r');
f = fopen('m.txt', 'w');
radek = fgetl(fid);          % evtl. fgets(fid) pro načtení řádku včetně znaku zalomení řádku
# uložení jako sloupcový vektor
rs = sscanf(radek,'%d')
fprintf(f, '%f\n', A);
r = rs(1);
fclose(f);
s = rs(2);
type m.txt
bxyz = fscanf(fid,'%f',[s r])
# znovunačtení do dimenze [5x5]
fclose(fid);
B = fscanf(f, '%f', [5, inf])
 
#
vstup = fopen('pr4uk3.txt','r');
# čtení z řetězce
radek = fscanf(vstup,'%s',4)
s = sscanf('10.2 5.222', '%f %f')
bxyh = fscanf(vstup,'%f',[4 inf])'
#
fclose(vstup);
# přeskakování položek
s = sscanf('10.2 5.222 4.2', '%f %*f %f')
</source>
</source>


Řádek 104: Řádek 51:


<source lang=octave>
<source lang=octave>
f = fopen('s.txt', 'w+')
fid = fopen('pr4uk4.txt','r');
fprintf(f, '%f\n', [1 2; 3 4])  
uhel = fscanf(fid,'%*s %f %f %f',[3 inf])'     % čtení jen numerických hodnot
fclose(f)
uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % kurzor je již na konci datového souboru
type s.txt
fseek(fid,0,'bof');                            % přesun kurzoru na začátek souboru
1.000000
                                                % totožné fseek(fid,0,-1)
3.000000
uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % čtení jen (3znakových) textových identifikátorů
2.000000
fclose all;
4.000000
#
f = fopen('s.txt')
a = fscanf(f, '%f', [1, inf])
b = fscanf(f, '%f', [2, inf])
fseek(f, 0)
b = fscanf(f, '%f', [2, inf])
</source>
</source>


== Úlohy ==
== Úlohy ==


* http://peso.fsv.cvut.cz/vyuka/git1/4.html
* [[155GIT1 / 4. cvičení / Příklady|4. cvičení - příklady]]
<!-- -->

Aktuální verze z 15. 3. 2023, 22:07

Čtení formátovaných dat z textových souborů

Náplň

  1. čtení dat z textového souboru do matice (ke stažení pr4uk1.txt, pr4uk2.txt, pr4uk3.txt, pr4uk4.txt)

Ukázky

Formátované čtení dat

(čtení z textového souboru)

 fid = fopen('pr4uk1.txt','r');
 bxy = fscanf(fid,'%f',[3 inf]);
 bxy = bxy'                    % pro shodné rozměry matice jako v datovém souboru
 fclose(fid);

 % přeskakování položek
 fid = fopen('pr4uk1.txt','r');
 xy = fscanf(fid,'%*f %f %f',[2 inf]);
 xy = xy'
 fclose(fid);

(čtení z řetězce / z textové proměnné)

 s = sscanf('10.2 5.222','%f')

(čtení textových souborů s hlavičkou)

 fid = fopen('pr4uk2.txt','r');
 radek = fgetl(fid);          % evtl. fgets(fid) pro načtení řádku včetně znaku zalomení řádku
 rs = sscanf(radek,'%d')
 r = rs(1);
 s = rs(2);
 bxyz = fscanf(fid,'%f',[s r])'  
 fclose(fid);

 vstup = fopen('pr4uk3.txt','r');
 radek = fscanf(vstup,'%s',4)
 bxyh = fscanf(vstup,'%f',[4 inf])'
 fclose(vstup);

Změna polohy kurzoru v souboru

 fid = fopen('pr4uk4.txt','r');
 uhel = fscanf(fid,'%*s %f %f %f',[3 inf])'     % čtení jen numerických hodnot
 uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % kurzor je již na konci datového souboru
 fseek(fid,0,'bof');                            % přesun kurzoru na začátek souboru
                                                % totožné fseek(fid,0,-1)
 uhelid = fscanf(fid,'%s %*s %*s %*s',[3 inf])' % čtení jen (3znakových) textových identifikátorů
 fclose all;

Úlohy