Dateien mit wahlfreiem Zugriff (Random Access Files) Anforderungen • Direkter Zugriff auf Datensätze • Schneller Zugriff ohne sequentiellen Suchvorgang • Einfügen von Datensätzen ohne andere Datensätze zu überschreiben • Ändern/Löschen von Datensätzen ohne andere Datensätze zu verändern Problem • C++ verwaltet keine Strukturinformation für Dateien • Programmierer muss random-access Dateien selbst erzeugen und verwalten Lösungsansätze • Am Anfang der Datei wird ein Inhaltsverzeichnis verwaltet • Einfachste Lösung: Datensätze mit fester Länge 0
100
100 Bytes
100 Bytes
200
100 Bytes
300
400
100 Bytes
100 Bytes
500
Dateiinhalt Satz Position in Nr Datei 1 2 3 …
100 150 250 ….
100 Bytes
Anforderungen an C++ • Positionieren in Dateien • Gleichzeitiges Lesen und Schreiben in einer Datei 25.11.2007
Byte Offset
FB Informatik Prof. Dr. R.Nitsch
C++ Dateien und Ströme
Die 100 Bytes können für eine TextSequenz oder für eine Binär-Sequenz benutzt werden 33
Positionierung in Dateien
FB Informatik Prof. Dr. R.Nitsch
• Beim Lesen und Schreiben von Dateien verwalten die File-Objekte automatisch je einen Leseoder Schreibzeiger. Bei fstream-Objekten können die beiden Zeiger nicht unabhängig voneinander positioniert werden. • Die Werte dieser Zeiger sind der Offset der aktuellen Position zum Anfang der Datei in Bytes • Beide Zeiger können mittels Zugriffsfunktionen gelesen und verändert werden. Rückgabetyp ios::pos_type ios::pos_type istream& istream& ostream& ostream&
Variable Bezug kann 3 mögliche Werte annehmen: ios::beg // relativ zum Dateianfang ios::cur // relativ zur aktuellen (current) Position ios::end // relativ zum Dateiende
25.11.2007
C++ Dateien und Ströme
34
Beispiel zum Positionieren in Dateien
FB Informatik Prof. Dr. R.Nitsch
#include Textdatei seek.dat #include 0123456789ABCDEF #include using namespace std; ios::beg ios::end Ausgabe void main() { 9 an Position 9 gefunden ifstream fin; Aktuelle Position: 12 if( ! fin.is_open() ) // is_open ausprobieren C an Position 12 gefunden fin.open("seek.dat"); D an der drittletzten Position gefunden fin.seekg(9); // absolute Leseposition C an Position 12 gefunden char c; Laenge der Datei in Bytes: 16 fin.get(c); // get schaltet Pos. weiter cout