Dateien mit wahlfreiem Zugriff (Random Access Files)

Dateien mit wahlfreiem Zugriff (Random Access Files) Anforderungen • Direkter Zugriff auf Datensätze • Schneller Zugriff ohne sequentiellen Suchvorgan...
5 downloads 1 Views 101KB Size
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&

Zugriffsfunktion

Bedeutung

tellg() aktuelle Leseposition tellp() aktuelle Schreibposition seekg(pos) absolute Lese-Position pos aufsuchen seekg(rel, Bezug) relative Position rel (zur Bezugsposition) aufsuchen seekp(pos) absolute Schreib-Position pos aufsuchen seekp(rel, Bezug) relative Schreib-Position rel (zur Bezugsposition) aufsuchen

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