31.07.2015 Aufrufe

• Permanente Datenspeicherung - Programmieren und Problemlösen

• Permanente Datenspeicherung - Programmieren und Problemlösen

• Permanente Datenspeicherung - Programmieren und Problemlösen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Agenda für heute, 1. Juni, 2006<strong>•</strong> <strong>Permanente</strong> <strong>Datenspeicherung</strong><strong>•</strong> Deklaration von Files<strong>•</strong> Files verwenden<strong>•</strong> Filetypen: Drei Kategorien<strong>•</strong> Sequentielle Files<strong>Permanente</strong> <strong>Datenspeicherung</strong>Daten, die während der Ausführung eines Computerprogrammserzeugt werden, gehen bei Beendigung des Programms verloren,ausser sie werden als Datei auf ein permanentes SpeichermediumgeschriebenSolche Dateien werden in Pascal mit Variablen vom DatentypFile bearbeitet<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>2/33© Institut für Computational Science, ETH ZürichArbeiten mit FilesDamit ein Programm mit externen Dateien arbeiten kann,müssen folgende Schritte ausgeführt werden:<strong>•</strong> Für das File muss eine Filevariable deklariert sein<strong>•</strong> Das File muss mit einem dem Betriebssystem bekannten, ev.noch zu kreierenden, Dateinamen in Verbindung gebrachtwerden<strong>•</strong> Das File muss durch das Programm geöffnet werdenDie Elemente eines FilesFilevariable1 KomponentennummerFilekomponentePositionszeiger der FilevariablenFile: Eine verlängerbare Folgevon Filekomponenten<strong>•</strong> Über die Filevariable wird in die Datei geschrieben oder ausder Datei gelesen<strong>•</strong> Das File muss durch das Programm geschlossen werden<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>333 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 4/33© Institut für Computational Science, ETH Zürich


Deklaration von Files<strong>•</strong> <strong>Permanente</strong> <strong>Datenspeicherung</strong><strong>•</strong> Deklaration von Files<strong>•</strong> Files verwendenDeklaration einer FilevariablenvarEingabedaten: file of Integer;<strong>•</strong> Filetypen: Drei Kategorien<strong>•</strong> Sequentielle FilesName der FilevariablenBasistypEin in Pascal deklarierbarer Typ<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>5/33© Institut für Computational Science, ETH ZürichDeklaration von FilesDeklaration eines FiletypstypeMessung = Real;Messwerte = file of Messung;varMWDatei_1 : Messwerte;MWDatei_2 : Messwerte;Vom gleichen Typ<strong>•</strong> <strong>Permanente</strong> <strong>Datenspeicherung</strong><strong>•</strong> Deklaration von Files<strong>•</strong> Files verwenden<strong>•</strong> Filetypen: Drei Kategorien<strong>•</strong> Sequentielle FilesMWDatei_3 : file of Messung;MWDatei_4 : file of Messung;Nicht vomgleichen Typ<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>6/33© Institut für Computational Science, ETH Zürich


Zuordnung eines Files zu einer DateiMit der Prozedur AssignFile wird der Filevariablen ein (<strong>und</strong> nurein) in einer Stringkonstanten oder -variablen angegebenerDateiname zugeordnet.AssignFile(Eingabedaten,'C:\Messwerte')Name der Filevariablenoder:constFilename = 'C:\Messwerte';AssignFile(Eingabedaten, Filename);Verzeichnispfad <strong>und</strong> DateinameZuordnung eines Files zu einer externen Datei mit OpenDialogUnter Verwendung der Delphi-Komponente OpenDialog: könnenDateinamen interaktiv eingegeben oder bestehende Dateinamenausgewählt werden:Nach drücken desButtons Öffnenkann der ausgewählteDateinameim Feld FileNameder KomponenteOpenDialoggelesen werdenAssignFile(Eingabedaten,OpenDialog1.FileName);<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>7/33© Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>8/33© Institut für Computational Science, ETH ZürichFiles zum Lesen oder Schreiben vorbereitenLese- oder Schreibzugriffe auf Filekomponenten sind erstmöglich nachdem ein File geöffnet worden istDazu stellt Pascal die ProzedurenÖffnen eines Files zum LesenMit der Prozedur Reset wird das File für eine bereits vorhandeneDatei geöffnet:Reset(Eingabedaten);ResetRewrite<strong>und</strong><strong>•</strong> Ist keine Datei mit dem angegebenen Namen vorhanden, dann trittein Eingabe/Ausgabe-Fehler aufzur VerfügungIn Delphi gibt es zusätzlich die ProzedurAppend um Text an Textfiles anzufügen<strong>•</strong> Ist das zu öffnende File bereits offen, wird es zuerst geschlossen<strong>und</strong> dann erneut geöffnet. Nach dem Öffnen wird der Positionszeigeran den Anfang des Files gesetzt<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>9/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 10/33© Institut für Computational Science, ETH Zürich


Lesen eines FilesMit der Prozedur Read wird der Inhalt einer FilekomponentegelesenvarMesswert: Real;Eingabedaten: file of Real;beginAssignFile(Eingabedaten,'C:\Messwerte')Reset(Eingabedaten);Read(Eingabedaten, Messwert);Lesen eines FilesBeim Lesen eines Files muss geprüft werden, ob das Ende des Fileserreicht wurdeDie Funktion EOF (End Of File) liefert "TRUE" sobald die letzteFilekomponente gelesen wurdeif NOT EOF(Eingabedaten)then Read(Eingabedaten, Messwert);FilevariableVariable, in die gelesen wird<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>11/33© Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>12/33© Institut für Computational Science, ETH ZürichÖffnen eines Files zum SchreibenDie Prozedur Rewrite erstellt ein neues File <strong>und</strong> öffnet esanschliessend:Rewrite(MWDatei_1);<strong>•</strong> Mit Rewrite wird ein File darauf vorbereitet, Daten in eine neueDatei unter dem mit AssignFile der Filevariablen (MWDatei_1)zugewiesenen Dateinamen zu schreiben<strong>•</strong> Existiert bereits eine gleichnamige Datei, wird deren Inhaltgelöscht <strong>und</strong> an ihrer Stelle die neue Datei angelegt<strong>•</strong> Ein bereits offenes File wird zuerst geschlossen <strong>und</strong> dann erneutgeöffnet. Nach dem Öffnen wird der Positionszeiger an denAnfang des Files gesetztSchreiben eines FilesMit der Prozedur Write wird eine Filekomponente geschriebenvarMesswert: Real;Eingabedaten: file of Real;beginAssignFile(Eingabedaten,'C:\Messwerte')Rewrite(Eingabedaten);Messwert:= 12.87;Write(Eingabedaten, Messwert);FilevariableVariable, deren Wert geschrieben wird<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>13/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 14/33© Institut für Computational Science, ETH Zürich


Schliessen eines FilesMit der Prozedur CloseFile wird ein File geschlossen. Diese Operationstellt sicher, dass alle Daten in die Datei geschrieben werdenNach CloseFile kann die Filevariable mit AssignFile einer anderen(oder nochmals der gleichen) Datei zugeordnet werdenAssignFile(Eingabedaten, 'C:\Messwerte');Reset(Eingabedaten);{ Datei Messwerte verarbeiten }CloseFile(Eingabedaten);AssignFile(Eingabedaten, 'A:\NeueWerte');Reset(Eingabedaten);{ Datei NeueWerte verarbeiten }Abfangen des Fehlers bei fehlenden Dateien<strong>•</strong> Pascal überprüft standardmässig ob Aufrufe von Eingabe-/AusgabeProzeduren <strong>und</strong> -Funktionen zu Problemen geführt haben (E/A-Fehler)<strong>•</strong> Beim Auftreten eines solchen Fehlers wird der Programmablauf in derRegel abgebrochen<strong>•</strong> Die automatische Fehlerüberprüfung kann mit einer sog. Compiler-Direktive deaktiviert werden: {$I-}Kommentar Compiler-Direktive Name Parameter{ $ I - }E/A-Fehler können so im eigenen Programm behandelt werden<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>15/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 16/33© Institut für Computational Science, ETH ZürichAbfangen des Fehlers bei fehlenden DateienZusammenfassung: DateneingabeDie Funktion IOResult liefert den Status der letzten E/A-OperationDazu muss die automatische E/A-Prüfung mit der Compiler-Direktiven{$I–} deaktiviert werdenAssignFile(Eingabedaten, 'C:\Messwerte');{$I-} {E/A-Prüfung ausschalten}Reset(Eingabedaten);{$I+} {E/A-Prüfung einschalten}if IOResult = 0then begin {File wurde fehlerfrei geöffnet}. . .endelse begin {File konnte nicht geöffnet werden}Externer SpeicherArbeitsspeicherEs soll eineTextdatei, Zeichenum Zeichen,eingelesen werdenchA:\Meindok.txtAssignFile(Eingabe,'A:\Meindok.txt');Reset(Eingabe);Pascal-AnweisungenRead(Eingabe,ch);Schritt 3 kann wiederholt werdenbis das Ende des Files erreichtwird123<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>17/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 18/33© Institut für Computational Science, ETH Zürich


Zusammenfassung: DatenausgabechPascal-Anweisungen<strong>•</strong> <strong>Permanente</strong> <strong>Datenspeicherung</strong><strong>•</strong> Deklaration von FilesArbeitsspeicherWrite(Ausgabe,ch);3<strong>•</strong> Files verwenden<strong>•</strong> Filetypen: Drei KategorienEs soll eineTextdatei, Zeichenum Zeichen,ausgeschriebenwerdenRewrite(Ausgabe);AssignFile(Ausgabe,'A:\Meindok.txt');21<strong>•</strong> Sequentielle FilesExterner SpeicherA:\Meindok.txt<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>19/33© Institut für Computational Science, ETH ZürichDrei Kategorien von FilesPascal unterscheidet zwischen folgenden Filetypen:<strong>•</strong> Typisierte Files<strong>•</strong> Untypisierte Files<strong>•</strong> TextfilesTypisierte FilesDie Filekomponenten sind von einem in Pascal deklarierbarenTypBeispielevarMesswerte: file of Real;Beobachtung: file of Boolean;Sequenz: file of Char;BezeichnerBasistyp<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>20/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 21/33© Institut für Computational Science, ETH Zürich


Untypisierte FilesWird bei der Deklaration der Filevariablen kein Basistypangegeben, dann speichert jede Filekomponente ein ByteVerwendet für Zugriffe bei denen keine Voraussetzungen fürStruktur <strong>und</strong> Inhalt der entsprechenden Dateien gemachtwerdenBeispielvarEingabedaten: file;TextfilesSpeichert zeilenweise angeordnete TextzeichenvarDokument: Textfile;<strong>•</strong> Standardprozeduren <strong>und</strong> -funktionen:AssignFile, Reset, Rewrite, Read, Write, CloseFile, EOF<strong>•</strong> Read- <strong>und</strong> Write-Prozeduren erlauben das Lesen <strong>und</strong> Schreibenvon Werten, die nicht den Typ Char haben<strong>•</strong> Mit Reset geöffnete Textfiles sind schreibgeschützt<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>22/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 23/33© Institut für Computational Science, ETH ZürichTextfiles lesenTextfiles lesenJede Zeile in einem Textfile wird mit einem Zeilenende-ZeichenabgeschlossenDieses Zeichen muss auch gelesen werdenvarDokument: Textfile;Zeile: String;Zeichen: Char;beginAssignFile(Dokument, 'C:\Meintext.txt');Reset(Dokument);Read(Dokument, Zeile);Read(Dokument); {liest End of line}Zur Vereinfachung stellt Pascal die Prozedur Readln (für Read Line)zur VerfügungStattRead(Dokument, Zeile);Read(Dokument);können wir abgekürzt schreibenReadln(Dokument, Zeile);<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>24/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 25/33© Institut für Computational Science, ETH Zürich


Textfiles lesenDie Standardfunktion EOLN (für End Of Line) liefert "TRUE" sobalddas nächste zu lesende Zeichen ein Zeilenende-Zeichen istSomit können wir Zeilen unbekannter Länge lesen:while not EOLN(Dokument) doRead(Dokument, Zeichen);Read(Dokument); {liest das Zeilenende-Zeichen}Textfiles lesen<strong>•</strong> Aus Textfiles gelesene Zeichenfolgen, die ganze oder reelleZahlen darstellen, werden automatisch in die entsprechendennumerischen Werte vom Typ Integer oder Real konvertiert<strong>•</strong> Entspricht die Zahl nicht dem erwarteten Format, tritt ein E/A-Fehler aufvarDokument: Textfile;Wert_1, Wert_2: Integer;beginRead(Dokument, Wert_1, Wert_2);<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>26/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 27/33© Institut für Computational Science, ETH ZürichTextfiles schreibenText anfügen<strong>•</strong> Akzeptiert werden Werte vom Typ Char, String, Boolean, einemInteger-Typ oder einem Real-Typ (automatische Konvertierung)varDokument: Textfile;Zeile: String; Wert: Real;beginRewrite(Dokument);Zeile:= 'ETH Zuerich');Write(Dokument, Zeile);Writeln;Wert:= 37.85;Writeln(Dokument, Wert);Mit der Prozedur Append wird ein Textfile so für Schreibzugriffegeöffnet, dass die Daten am Ende des Files angefügt werdenAppend(Dokument);<strong>•</strong> Die Textfilevariable (Dokument) muss mit AssignFile einer Dateizugeordnet worden sein<strong>•</strong> Ist das File bereits offen, wird es zuerst geschlossen <strong>und</strong> dannerneut geöffnet<strong>•</strong> Der Positionszeiger wird auf das Fileende gesetzt<strong>•</strong> Im Gegensatz zu Rewrite wird mit Append der Inhalt einerbestehenden Datei nicht gelöscht<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>28/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 29/33© Institut für Computational Science, ETH Zürich


Text anfügenvarDokument: Textfile;Zeile: String;Leitzahl: Integer;beginAppend(Dokument);Zeile:= 'ETH ';Leitzahl:= 8092;Writeln(Dokument,Zeile,Leitzahl,' Zuerich');<strong>•</strong> <strong>Permanente</strong> <strong>Datenspeicherung</strong><strong>•</strong> Lesen <strong>und</strong> schreiben in Pascal<strong>•</strong> Filetypen: Drei Kategorien<strong>•</strong> Arbeiten mit Files<strong>•</strong> Sequentielle Files<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>30/33© Institut für Computational Science, ETH ZürichSchreiben einer sequentiellen DateiLesen einer sequentiellen DateiSchematische DarstellungSchematische DarstellungAssignFile(F,'D')FDAssignFile(F,'D')FDRewrite(F) F D0Write(F,V) F DV 1Vorsicht:Rewrite löschtden Inhalt einerbestehenden Datei!Reset(F) FD0Read(F,V) F DV 1Write(F,V) F DRead(F,V)FDV 2V 2<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>31/33 © Institut für Computational Science, ETH Zürich<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong> 32/33© Institut für Computational Science, ETH Zürich


Lesen einer sequentiellen DateiSchematische DarstellungRead(F,V) F DVnRead(F,V)FDV n+1EOF(F) = trueEine weitere Read-Anweisung würde zu einem Laufzeitfehler führen<strong>Programmieren</strong> <strong>und</strong> <strong>Problemlösen</strong>33/33© Institut für Computational Science, ETH Zürich

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!