agenda für heute, 9. juni, 2005 direkte filezugriffedirekte filezugriffe textfiles bitmap-dateien...

25
Agenda für heute, 9. Juni, 2005 Direkte Filezugriffe Direkte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Upload: tadday-antoni

Post on 06-Apr-2015

107 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Agenda für heute, 9. Juni, 2005

• Direkte FilezugriffeDirekte Filezugriffe

• Textfiles

• Bitmap-Dateien

• Datentypen: Mengen

Page 2: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Direkte Filezugriffe

Das Problem sequentieller Dateien:

Will man die k-te Filekomponente einer sequentiellen Datei lesen, dann müssen zuerst alle k-1 vorangehenden Filekomponenten gelesen werden.  Schreiben ist nur am Ende der Datei möglich.

Die Lösung:

In Delphi steht uns die Prozedur Seek zur Verfügung. Mit Seek kann der Positionszeiger einer Filevariablen (F) auf eine bestimmte Position (N) gesetzt werden. Die nachfolgenden Read- und Write-Operationen betreffen die entsprechende Filekompenente.

procedure Seek(var F; N: Longint);

2/22

Page 3: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Direkte Filezugriffe

Beispiel

Wir möchten den 21. Eintrag in der Datei Messstation in die 80. Position derselben Datei schreiben:

Seek(Messstation,20);

Read(Messstation,MW1);

Seek(Messstation,79);

Write(Messstation,MW1)

Um eine Datei zu vergrössern, geben Sie beim Aufruf von Seek eine Komponente hinter der letzen Komponente in der Datei an:

Seek(F, FileSize(F))

Dieser Prozeduraufruf setzt den Positionszeiger ans Dateiende.

FileSize kann nicht für Textdateien verwendet werden.

3/22

Page 4: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Direkte Filezugriffe

Beispiel

Mit Wiederholungsanweisungen können ganze Bereiche einer Datei verarbeitet werden:

for i:= 100 to 200 do

begin

Seek(Messstation,i);

Read(Messstation,MW1);

{ MW1 verarbeiten }

end

4/22

Was aber, wenn die Datei nur 150 Elemente enthält?

Um Zugriffsfehler zu verhindern:

s:= FileSize(Messstation);

for i:= 101 to 200 do

if i < s then

begin

Seek(Messstation,i);

Read(Messstation,MW1);

{ MW1 verarbeiten }

end

Page 5: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

• Direkte Filezugriffe

• TextfilesTextfiles• Bitmap-Dateien

• Datentypen: Mengen

Page 6: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Eigenschaften von Textfiles

• In Textfiles können Werte vom Typ Char, String, Boolean, einem Integer-Typ oder einem Real-Typ geschrieben werden.

• In Textfiles geschriebene Werte eines Integer-Typs, eines Real-Typs oder vom Typ Boolean werden automatisch in die entsprechende Zeichendarstellung konvertiert.

• Aus Textfiles gelesene Zeichenfolgen, die ganze oder reelle Zahlen darstellen, werden automatisch in die numerischen Werte konvertiert. Entspricht die Zahl nicht dem erwarteten Format, tritt ein E/A-Fehler auf.

 

5/22

Page 7: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Eigenschaften von Textfiles

Beispiel

var

F: textfile; I: integer; B: boolean;

Der Prozeduraufruf

Read(F,I)liest im File F eine Zeichenfolge bis zum nächsten Leerzeichen oder End-of-line-Zeichen, interpretiert sie als ganze Zahl vom Typ Integer und speichert ihren Wert in der Variablen I.

Mit der Anweisungsfolge

B:= true;Write(F,B)

wird am Ende des Files F das Wort 'TRUE' angefügt.

6/22

Page 8: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Eigenschaften von Textfiles

Textfiles speichern lineare Folgen von Textzeichen. Sie haben zusätzlich eine Zeilenstruktur, die durch spezielle Zeichen, welche das Ende einer Zeile markieren, gegeben ist.Der Text:

Programmieren mitDelphi

würde wie folgt gespeichert:

P r o g r a m m i e r e n m i t cr lf D e l p h i

End-of-line-Zeichen End-of-file-Zeichenz.B. Ord: 13 & 10 (betriebssystemspezifisch)

7/22

Page 9: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Eigenschaften von Textfiles

Weil Textfiles eine Zeilenstruktur haben, müssen End-of-line-Zeichen erkannt und auch geschrieben werden können.

Pascal stellt dazu die zwei Standardprozeduren Readln und Writeln zur Verfügung.

Die Prozedur Readln liest eine Zeile Text und "springt" dann an den Anfang der nächsten Zeile der Datei.

Der Prozeduraufruf:

Readln(F)

in dem F der Name eines Textfiles ist, ist äquivalent zu den folgenden Anweisungen:

while not Eoln(F) do Read(F);Read(F)

8/22

Page 10: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Eigenschaften von Textfiles

Die Prozedur Writeln wird dazu verwendet, um die aktuelle Ausgabe-zeile zu beenden und eine neue zu beginnen.

Der Prozeduraufruf:

Writeln(F, P)

in dem F der Bezeichner eines Textfiles und P der Bezeichner einer Variablen ist, ist äquivalent zu den folgenden Anweisungen:

Write(F, P);Writeln(F)

Das nächste Write scheibt das erste Zeichen in die nächste Zeile der Datei.

Textfiles können mit rewrite(F) oder mit append(F) geöffnet werden.Rewrite überschreibt ab Fileanfang, append fährt am Fileende fort.

9/22

Page 11: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

• Direkte Filezugriffe

• Textfiles

• Bitmap-DateienBitmap-Dateien• Datentypen: Mengen

Page 12: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien

BMP-Dateien bestehen aus drei Teilen: dem Dateikopf, dem Informationsblock und den Bilddaten.

Dateikopf

(BITMAPFILEHEADER)

Informationsblock

(BITMAPINFO):Bitmap-Eigenschaften

(BITMAPINFOHEADER)Eventuell: Farbmasken

Eventuell: Farbtabelle

Eventuell: Ungenutzter Platz

Bilddaten

Eventuell: Ungenutzter Platz

14 Byte

40 Byte

10/22

Die Bilddaten werden zeilenweise gespeichert. In der Regel beginnen die Bilddaten mit der letzten und enden mit der ersten Bildzeile.

Page 13: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien

11/22

bmpheader = packed record {----- fileinfo --------} bfType: word; bfSize: longint; bfReservde1: word; bfReserved2: word; bfOffBits: longint; {----- Bildinfo --------} biSize: longint; biWidth: longint; biHeight: longint; biPlanes: word; biBitCount: word; biCompress: longint; biSizeImage: longint; biXPPM: longint; biYPPM: longint; biClrUsed: longint; biClrImport: longint;end;

Typendeklaration für Filevariable um Dateikopf und Informationsblock einer Bitmap-Datei einzulesen.

Page 14: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-File von Übung 6 selber einlesen

var bildheader: file of bmpheader; bh: bmpheader; binfo: file of byte; i: integer; b:byte;

begin AssignFile(bildheader,'Bild1.bmp'); Reset(bildheader); read(bildheader,bh); CloseFile(bildheader); AssignFile(binfo,'Bild1.bmp'); Reset(binfo)end;

for i:= 1 to bh.bfOffBits do Read(binfo,b); {fileheader überspringen}

{ab hier Bilddaten verarbeiten}

12/22

Page 15: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-File von Übung 6 selber einlesen (Fortsetzung)

varbl, gr, rot: byte;x, y, i: cardinal;

for y:= bh.biHeight-1 downto 0 do

begin

for x:= 0 to bh.biWidth-1 do

begin

Read(binfo,bl); Read(binfo,gr); Read(fi1,rot);

Image1.Canvas.pixels[x,y]:= 65536*bl+256*gr+rot;

end; for i:= 1 to bh.biWidth mod 4 do Read(binfo,rot)

{die Null-Einträge am Ende der Zeile überspringen}end;

13/22

Page 16: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Standardprozeduren und -funktionen für Files

AssignFile Weist einer Dateivariablen den Namen einer externen Datei zu. CloseFile Schliesst eine geöffnete Datei. Eof Prüft, ob das Ende der Datei erreicht ist. Erase Löscht eine externe Datei. FilePos Liefert die aktuelle Position innerhalb einer Datei. FileSize Liefert die aktuelle Grösse einer Datei. GetDir Ermittelt das aktuelle Verzeichnis eines Laufwerks. IOResult Liefert den Status der zuletzt durchgeführten Ein-/Ausgabe-Operation. MkDir Erzeugt ein Unterverzeichnis. Rename Benennt eine externe Datei um. Reset Öffnet eine existierende Datei. Rewrite Erzeugt und öffnet eine neue Datei. RmDir Löscht ein leeres Unterverzeichnis. Seek Bewegt den Positionszeiger zur angegebenen Filekomponente. Truncate Schneidet eine Datei an der aktuellen Position ab.

14/22

Page 17: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Standardprozeduren und -funktionen für Files

Append Öffnet eine existierende Datei für das Anhängen weiterer Daten. Eoln Prüft, ob das Zeilenende in einer Textdatei erreicht ist. Flush Leert den Puffer einer Textdatei, die für die Ausgabe geöffnet wurde. Read Bei typisierten Dateien: liest eine oder mehrere Komponenten in eine

Variable. Bei Textdateien: liest einen oder mehrere Werte in eine oder mehrere Variablen.

Readln Führt einen Aufruf von Read aus und springt dann zum Anfang der nächsten Zeile der Datei.

SeekEof Liefert den Dateiendestatus einer Datei (EOF) zurück. SeekEoln Liefert den Zeilenendestatus einer Datei (EOLN) zurück. SetTextBuf Weist einer Textdatei einen Ein-/Ausgabepuffer zu. Write Bei typisierten Dateien: Schreibt eine Variable in eine

Dateikomponente. Bei Textdateien: Schreibt einen oder mehrere Werte in die Datei.

Writeln Ruft die Prozedur Write auf und schreibt dann einen Zeilenvorschub in die Datei.

15/22

Page 18: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

• Direkte Filezugriffe

• Textfiles

• Bitmap-Dateien

• Datentypen: MengenDatentypen: Mengen

Page 19: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen

Jeder Datentyp definiert eine Menge von Werten.

Im Falle des Mengentyps ist es die Menge aller möglichen Mengen, die aus den Elementen eines gegebenen Basistyps bestehen.

Beispiel

Type Aufzählungstyp

Farbe = (rot, gruen, blau);

S = set of Farbe;

Basistyp (max. 256 Elemente)

16/22

Page 20: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen: Eigenschaften

Die Werte des Typs S sind die Mengen:

[], [rot], [gruen], [blau], [rot, gruen],

[rot, blau], [gruen, blau], [rot, gruen, blau]

• Hat der Basistyp n unterschiedliche Werte, dann besitzt ihr

Mengentyp 2n Werte.

• Die Basis eines Mengentyps muss ein Ordinaltyp sein.(Aufzählungs- oder Unterbereichstyp)

• Die Ordinalwerte der oberen und unteren Grenzen des Basistyps müssen im Bereich 0..255 liegen.

17/22

Page 21: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen: Operationen

Vereinigung +[rot] + [gruen] ⇨ [rot, gruen]

Durchschnitt *[rot, gruen] * [gruen, blau] ⇨ [gruen]

Differenz –[rot, gruen, blau] – [gruen] ⇨ [rot, blau]

Element in (Mengenzugehörigkeit)

[rot] in [rot, gruen] ⇨ TRUE

18/22

Page 22: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen: Operationen

Vergleich

= Gleichheit

<> Ungleichheit

<= Teilmenge

>= Obermenge

[rot] = [rot, blau] ⇨ FALSE[rot] <> [rot, blau] ⇨ TRUE[rot] <= [rot, blau] ⇨ TRUE[rot] >= [rot, blau] ⇨ FALSE

19/22

Page 23: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen: Anwendungsbeispiele

Vergleichsoperationen werden durch den Mengentyp vereinfacht:

var ch: char;('0' <= ch) and (ch <= '9') ist wahr, wenn ch eine Ziffer

darstellt.

Oft müssen beim Lesen einer Datei bestimmte Werte übersprungen werden. Die Anweisung:

while ch in [' ',',','.',';',':'] do read(F,ch);

"springt" über Leerzeichen und Satzzeichen in der File "F".

Der Mengentyp erlaubt einen bündigeren, besser lesbaren Ausdruck:

ch in ['0'..'9']

20/22

Page 24: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen: Anwendungsbeispiele

Das Kombinieren verschiedener Objekte wird durch den Mengentyp vereinfacht:

type Zutaten = (Aepfel, Erdbeeren, Bananen, Nuesse,

Icecream, Schokolade, Rahm, Zucker);

Dessert = set of Zutaten;

var

Bananensplit, Strudel, Bananensplit_plus: Dessert;

Bananensplit_plus:= Bananensplit + [Rahm];

Bananensplit:= [Bananen, Icecream, Schokolade];

21/22

Page 25: Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Mengentypen: Anwendungsbeispiele

Test auf Mengenzugehörigkeit:

var Rahmschlagen: boolean;

Rahmschlagen:= Rahm in Bananensplit;

Rahmschlagen:= Rahm in Bananensplit_plus;

True

False

22/22