Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Agenda für heute, 9. Juni, 2005 Direkte FilezugriffeDirekte Filezugriffe Textfiles Bitmap-Dateien Datentypen: Mengen."—  Präsentation transkript:

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

2 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

3 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

4 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

5 Direkte Filezugriffe TextfilesTextfiles Bitmap-Dateien Datentypen: Mengen

6 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

7 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

8 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 mit Delphi würde wie folgt gespeichert: ProgrammierenmitcrlfDelphi End-of-line-Zeichen End-of-file-Zeichen z.B. Ord: 13 & 10 (betriebssystemspezifisch) 7/22

9 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

10 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

11 Direkte Filezugriffe Textfiles Bitmap-DateienBitmap-Dateien Datentypen: Mengen

12 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.

13 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.

14 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

15 Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich Bitmap-File von Übung 6 selber einlesen (Fortsetzung) var bl, 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

16 Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich Standardprozeduren und -funktionen für Files AssignFileWeist einer Dateivariablen den Namen einer externen Datei zu. CloseFileSchliesst eine geöffnete Datei. EofPrüft, ob das Ende der Datei erreicht ist. EraseLöscht eine externe Datei. FilePosLiefert die aktuelle Position innerhalb einer Datei. FileSizeLiefert die aktuelle Grösse einer Datei. GetDirErmittelt das aktuelle Verzeichnis eines Laufwerks. IOResultLiefert den Status der zuletzt durchgeführten Ein-/Ausgabe-Operation. MkDirErzeugt ein Unterverzeichnis. RenameBenennt eine externe Datei um. ResetÖffnet eine existierende Datei. RewriteErzeugt und öffnet eine neue Datei. RmDirLöscht ein leeres Unterverzeichnis. SeekBewegt den Positionszeiger zur angegebenen Filekomponente. TruncateSchneidet eine Datei an der aktuellen Position ab. 14/22

17 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. EolnPrüft, ob das Zeilenende in einer Textdatei erreicht ist. FlushLeert den Puffer einer Textdatei, die für die Ausgabe geöffnet wurde. ReadBei typisierten Dateien: liest eine oder mehrere Komponenten in eine Variable. Bei Textdateien: liest einen oder mehrere Werte in eine oder mehrere Variablen. ReadlnFührt einen Aufruf von Read aus und springt dann zum Anfang der nächsten Zeile der Datei. SeekEofLiefert den Dateiendestatus einer Datei (EOF) zurück. SeekEolnLiefert den Zeilenendestatus einer Datei (EOLN) zurück. SetTextBufWeist einer Textdatei einen Ein-/Ausgabepuffer zu. WriteBei typisierten Dateien: Schreibt eine Variable in eine Dateikomponente. Bei Textdateien: Schreibt einen oder mehrere Werte in die Datei. WritelnRuft die Prozedur Write auf und schreibt dann einen Zeilenvorschub in die Datei. 15/22

18 Direkte Filezugriffe Textfiles Bitmap-Dateien Datentypen: MengenDatentypen: Mengen

19 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

20 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 2 n 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

21 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

22 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

23 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

24 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

25 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


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

Ähnliche Präsentationen


Google-Anzeigen