Programmation C: comment accéder aux fichiers stockés dans le stockage aléatoire

L'accès de fichier aléatoire dans la programmation C n'a rien à voir avec des nombres aléatoires. Plutôt, le fichier peut être consulté à tout moment ici, là, et même Yon. Ce type d'accès fonctionne mieux lorsque le fichier est parsemée de dossiers de la même taille. La notion de dossiers apporte des structures, qui peuvent facilement être écrites dans un fichier, puis récupérés retour individuellement, de manière sélective, ou tout à la fois.

Sommaire

Comment lire et rembobinage

Comme votre programme lit les données d'un fichier, il garde la trace de la position à partir de données d'où est lu dans le fichier. Une position du curseur est maintenu de sorte que l'endroit où le code lit ou écrit dans un fichier ne soit pas perdu.

Lorsque vous ouvrez un fichier, la position du curseur est au début du fichier, le premier octet. Si vous lisez un record de 40 octets dans la mémoire, la position du curseur est de 40 octets à partir du début. Si vous lisez jusqu'à la fin du fichier, la position du curseur soutient que l'emplacement ainsi.

Pour garder les choses confuses, la position du curseur est souvent considéré comme un pointeur de fichier, même si il est pas une variable de pointeur ou un type de pointeur de fichier. Il est tout simplement l'emplacement dans un dossier où l'octet de données suivant est lu.

Vous pouvez jouer avec la position du curseur à l'aide de plusieurs fonctions intéressantes en C. Deux d'entre eux sont ftell () et rewind (). La fonction ftell () renvoie la position actuelle du curseur qui est compensé comme une valeur long int. La fonction rewind () déplace le curseur au début du fichier.

La boucle while à Tell et Rewind lit dans les dossiers du fichier bond.db. À la ligne 28, la fonction ftell () renvoie la position du curseur. Si elle est supérieure à une entrée (ce qui signifie que la deuxième entrée a été lue), la position du curseur est réinitialisé au début du fichier par la fonction rewind () à la ligne 29.

DITES et rembobiner

 #include #include #include int main () {entrée struct {char acteur [32] -int titre l'année-char [32] -} - struct entrée obligataire FILE * comptage A007-int = = 0-A007 fopen («lien .db "," r ") - if (! A007) {puts (" SPECTRE gagne! ") - sortie (1) -} while (fread (obligataire, sizeof (entrée struct), 1, A007)) {printf ( "% s t% d t% s n", bond.actor, bond.year, bond.title) -Si (ftell (A007)> sizeof (entrée struct)) rewind (A007) -count ++ - si ( compter> 10) percée} fclose (A007) -retour (0) -}

Pour déterminer le bon décalage, une instruction if compare le résultat de la fonction et sizeof ftell () opérateur sur l'entrée de la structure. Gardez à l'esprit que ftell () renvoie simplement une valeur de long int, pas un nombre spécifique de structures.

La variable count, déclarée et initialisée à la ligne 14, conserve la trace de combien de répétitions boucle while. Si elle n'a pas, le programme boucle sans fin. C'est mauvais. Ainsi, lorsque la valeur de comptage est supérieure à 10, les sauts de boucle et le fichier se ferme et le programme se termine.

Exercice 1: Tapez le code source du Tell et Rewind dans votre éditeur. Construire et exécuter de voir comment les fonctions ftell () et rewind () fonctionnent.

Comment trouver un enregistrement spécifique

Lorsqu'un fichier contient tous les enregistrements de la même taille, vous pouvez utiliser la fonction fseek () pour arracher toute pièce. Le format de fseek () est

fseek (poignée, offset, où) -

manipuler est un descripteur de fichier, un pointeur de fichier représentant un fichier qui est ouvert pour la lecture. offset est le nombre d'octets à partir du début, la fin ou la position actuelle dans un fichier. Et d'où est l'une des trois constantes: SEEK_SET, SEEK_CUR ou SEEK_END pour le début, la position actuelle, ou à la fin d'un fichier, respectivement.


Tant que votre fichier contient des enregistrements d'une taille constante, vous pouvez utiliser fseek () pour arracher tout dossier spécifique, comme le montre rechercher un enregistrement spécifique dans un fichier.

Trouver un enregistrement spécifique dans un fichier

#include #include #include int main () {entrée struct {char acteur [32] -int titre l'année-char [32] -} - struct entrée obligataire FILE * = A007-A007 de fopen ("bond.db", " r ") - si (! A007) {puts (" SPECTRE gagne! ") - sortie (1) -} fseek (A007, sizeof (entrée struct) * 1, SEEK_SET) -fread (obligataire, sizeof (entrée struct), 1, A007) -printf ("% s t% d t% s n", bond.actor, bond.year, bond.title) -fclose (A007) -retour (0) -}

Le code montré dans Trouver un enregistrement spécifique dans un fichier est à nouveau assez similaire au code indiqué dans le listing 22-9. Le grand plus est la fonction fseek (), montré à la ligne 21. Il définit la position du curseur de sorte que la fonction fread () qui suit (voir ligne 22) se lit dans un dossier spécifique situé à l'intérieur de la base.

À la ligne 21, la fonction fseek () examine le dossier représenté par poignée A007. Le décalage est calculé en multipliant la taille de la structure d'entrée.

Comme un tableau, multipliant cette taille par 1 donne le deuxième enregistrement dans le Fichier multiplier la valeur par 0 (ou tout simplement indiquer 0 dans la fonction) pour lire le premier enregistrement. La constante de SEEK_SET assure que fseek () commence à regarder depuis le début du fichier.

L'effet net du code est que le deuxième enregistrement dans le fichier de bond.db est affiché.

Exercice 2: Tapez le code source de rechercher un enregistrement spécifique dans un fichier. Construire et exécuter pour voir le deuxième enregistrement dans le fichier.


» » » » Programmation C: comment accéder aux fichiers stockés dans le stockage aléatoire