C-Programmierung: Wie Dateien in zufälliger Lagerung Die für den Zugriff auf

Zufällige Dateizugriff in der C-Programmierung hat nichts mit Zufallszahlen zu tun. Vielmehr kann die Datei an einem beliebigen Punkt zugegriffen werden hierhin, dorthin, und sogar yon. Diese Art des Zugriffs funktioniert am besten, wenn die Datei mit Datensätzen von der gleichen Größe übersät ist. Der Begriff der Aufzeichnungen bringt Strukturen, die leicht in eine Datei geschrieben werden kann, und dann holte einzeln zurück, selektiv oder alle auf einmal.

Menu

Wie zu lesen und zurückspulen

Als Ihr Programm Daten aus einer Datei liest, hält sie den Überblick über die Position, von wo Daten in der Datei gelesen wird. Ein Cursor-Position wird beibehalten, so dass die Stelle, an der der Code liest oder in eine Datei zu schreiben ist nicht verloren.

Wenn Sie zuerst eine Datei zu öffnen, ist die Cursorposition am Anfang der Datei, das erste Byte. Wenn Sie ein 40-Byte-Datensatz in den Speicher gelesen, ist die Cursorposition 40 Bytes von Anfang an. Wenn Sie bis zum Ende der Datei zu lesen, hält der Cursor-Position als auch diese Position.

Um die Dinge verwirrend, wird der Cursor-Position oft als ein Dateizeiger, auch wenn es nicht eine Zeigervariable oder einen Dateityp des Zeigers ist. Es ist einfach die Position innerhalb einer Datei, in der das nächste Byte von Daten gelesen werden.

Sie können Chaos mit der Cursor-Position von in C einige interessante Funktionen Zwei von ihnen sind ftell () und rewind (). Die ftell () Funktion gibt den aktuellen Cursorposition, die als long int-Offset-Wert ist. Der Rücklauf () Funktion bewegt den Cursor an den Anfang der Datei zurück.

Die while-Schleife in Tell und Rewind liest Datensätze aus der bond.db Datei. In Zeile 28, die ftell () Funktion gibt die Position des Cursors. Wenn es mehr als einen Eintrag (dh, dass der zweite Eintrag gelesen worden ist), ist die Cursorposition durch die rewind () Funktion auf Linie 29 zu dem Anfang der Datei zurückgesetzt.

TELL und Zurückspulen

 # include # include # include int main () {struct entry {char Schauspieler [32] -int Jahr-Zeichen Titel [32] -} - struct Eintrag Bindung-FILE * A007-int count = 0-A007 = fopen ( "bond .db "," r ") - if (! A007) {puts (" gewinnt SPECTRE ") - Ausgang (1) -} while (fread (Bindung, sizeof (struct entry), 1, A007)) {printf ( "% s t% d t% s n", bond.actor, bond.year, bond.title) -wenn (ftell (A007)> sizeof (struct entry)) zurückspulen (A007) -count ++ - if ( count> 10) Break-} fclose (A007) -return (0) -}

Um zu bestimmen, den richtigen Offset, eine if-Anweisung das Ergebnis von der ftell () Funktion und sizeof Operator über die Struktur Eintrag vergleicht. Beachten Sie, dass ftell () nur einen long int-Wert zurückgibt, nicht eine bestimmte Anzahl von Strukturen.

Die variable Zählung, erklärt und bei Zeile 14 initialisiert, verfolgt, wie oft die while-Schleife wiederholt. Wenn es nicht klappt, würde die Programmschleife endlos. Das ist schlecht. Also, wenn der Wert der Zählwert größer als 10 ist, wird die Schleife bricht und dann die Datei wird geschlossen, und das Programm endet.

Übung 1: Geben Sie den Quellcode von Tells und Zurückspulen in Ihren Editor. Erstellen und ausführen, um zu sehen, wie die ftell () und rewind () Funktionen arbeiten.

Wie man einen bestimmten Datensatz zu finden

Wenn eine Datei erfasst alle von derselben Größe enthält, können Sie die fseek () Funktion benutzen, um jeden einzelnen Punkt herausreißen. Das Format für fseek () ist

fseek (Griff, Offset, von wo aus) -

Griff ist ein Datei-Handle, ein Zeiger-Datei eine Datei darstellt, die zum Lesen geöffnet ist. ausgleichen ist die Anzahl der Bytes vom Beginn, das Ende oder aktuelle Position in einer Datei. Und woher ist eine von drei Konstanten: SEEK_SET, SEEK_CUR oder SEEK_END für den Start, aktuelle Position oder Ende einer Datei auf.

Solange Ihre Datei Datensätze einer konstanten Größe enthält, können Sie fseek () verwenden, eine bestimmte Aufzeichnung auszureißen, wie es in einem bestimmten Datensatz in einer Datei suchen angezeigt.

FINDEN einen bestimmten Datensatz in einer Datei

# include # include # include int main () {struct entry {char Schauspieler [32] -int Jahr-Zeichen Titel [32] -} - struct Eintrag Bindung-FILE * A007-A007 = fopen ( "bond.db", " r ") - if (! A007) {puts (" gewinnt SPECTRE ") - Ausgang (1) -} fseek (A007, sizeof (struct entry) * 1, SEEK_SET) -fread (Bindung, sizeof (struct entry), 1, A007) -printf ( "% s t% d t% s n", bond.actor, bond.year, bond.title) -fclose (A007) -return (0) -}

Der Code gezeigt in Suche einen bestimmten Datensatz in einer Datei ist wieder ganz ähnlich dem Code in Listing 22-9 gezeigt. Der große Ergänzung ist die fseek () Funktion, gezeigt bei Line 21. Er setzt die Cursor-Position, so dass die fread () Funktion, die (auf Zeile 22 beziehen) mit folgendem Wortlaut in einem bestimmten Datensatz in der Datenbank befinden.

In Zeile 21, die fseek () Funktion überprüft die Datei durch den Griff A007 vertreten. Der Offset wird berechnet, indem die Grße der Eintragsstruktur multipliziert werden.

Wie bei einem Array von 1, dass Größe multipliziert ergibt die zweite Rekord in der File- den Wert von 0 multiplizieren (oder geben Sie nur 0 in der Funktion) den ersten Datensatz zu lesen. Die SEEK_SET konstant gewährleistet, dass fseek () beginnt am Anfang der Datei zu suchen.

Der Nettoeffekt des Codes ist, dass der zweite Datensatz in der bond.db-Datei angezeigt wird.

Übung 2: Geben Sie den Quelltext finden einen bestimmten Datensatz in einer Datei. Erstellen Sie und führen Sie den zweiten Datensatz in der Datei zu sehen.

Menü