Programación C: ¿Cómo acceder a los archivos almacenados en el almacenamiento aleatorio

Acceso a los archivos al azar en la programación C no tiene nada que ver con números aleatorios. Más bien, el archivo se puede acceder en cualquier momento acá, allá, e incluso yon. Este tipo de acceso funciona mejor cuando el archivo está salpicado de registros del mismo tamaño. La noción de registros plantea estructuras, que pueden ser fácilmente escriben en un archivo y luego fue a buscar la espalda de forma individual, de forma selectiva, o todos a la vez.

Cómo leer y rebobinado

A medida que su programa lee los datos de un archivo, se realiza un seguimiento de la posición a partir de datos de donde se lee en el archivo. Una posición del cursor se mantiene de manera que no se pierde la ubicación en la que el código está leyendo o escribiendo en un archivo.

La primera vez que abre un archivo, la posición del cursor está al principio del archivo, el primer byte. Si usted lee un registro de 40 bytes en la memoria, la posición del cursor es de 40 bytes desde el principio. Si usted lee hasta el final del archivo, la posición del cursor mantiene ese lugar también.

Para mantener las cosas confusas, la posición del cursor se refiere a menudo como un apuntador de archivo, a pesar de que no es una variable de puntero o un tipo de archivo de puntero. Se trata simplemente de la ubicación dentro de un archivo en el que se lee el siguiente byte de datos.

Puede meterse con la posición del cursor mediante el uso de varias funciones interesantes en C. Dos de ellos son ftell () y rewind (). La función ftell () devuelve la posición actual del cursor que está compensado como un valor int largo. La función rewind () desplaza el cursor al inicio del archivo.

El bucle while en Tell y Rewind lee en los registros del archivo bond.db. En la línea 28, la función ftell () devuelve la posición del cursor. Si es mayor de una entrada (lo que significa que la segunda entrada se ha leído), la posición del cursor vuelve al principio del archivo por la función rewind () en la línea 29.

Recomienda y REWIND

 #include #include #include int main () {entrada struct {actor de char [32] -INT título el año-char [32] -} - struct entrada bonos FILE * a007-int count = = 0-A007 fopen ("bonos .db "," r ") - if (! a007) {puts (" SPECTRE gana ") - la salida (1) -} while (fread (bond, sizeof (struct entrada), 1, a007)) {printf ( "% s t% d t% s n", bond.actor, bond.year, bond.title) -si (ftell (a007)> sizeof (struct entrada)) rewind (a007) -count ++ - si ( contar> 10) desglose} fclose (a007) -Retorno (0) -}

Para determinar el correcto desplazamiento, una sentencia if compara el resultado de la ftell () y sizeof operador en la entrada de la estructura. Tenga en cuenta que ftell () simplemente devuelve un valor entero largo, no un número específico de estructuras.

El recuento de variables, declarado e inicializado en la línea 14, realiza un seguimiento de las veces que el bucle while repite. Si no fuera así, el programa haría bucle sin fin. Eso es malo. Así que cuando el valor de recuento es mayor que 10, se rompe el bucle y entonces el archivo se cierra y el programa termina.

Ejercicio 1: Escriba el código fuente de Tell y rebobinado en su editor. Genere y ejecute para ver cómo operan las funciones ftell () y rewind ().

¿Cómo encontrar un registro específico

Cuando un archivo contiene registros de todas del mismo tamaño, puede utilizar la función fseek () para arrancar cualquier elemento individual. El formato de fseek () es

fseek (manejar, offset, de donde) -

manejar es un identificador de archivo, un puntero a FILE que representa un archivo que está abierto para la lectura. compensar es el número de bytes desde el principio, al final o posición actual en un archivo. Y ¿de dónde es uno de tres constantes: SEEK_SET, SEEK_CUR o SEEK_END para el inicio, la posición actual, o al final de un archivo, respectivamente.

Mientras su archivo contiene registros de un tamaño constante, puede utilizar fseek () para arrancar cualquier registro específico, como se muestra en buscar un registro específico en un archivo.

Buscar un registro ESPECÍFICO EN UN ARCHIVO

#include #include #include int main () {entrada struct {actor de char [32] -INT título el año-char [32] -} - struct entrada bonos ARCHIVO * =-A007 A007 fopen ("bond.db", " r ") - si (! A007) {puts (" SPECTRE gana ") - la salida (1) -} fseek (a007, sizeof (struct entrada) * 1, SEEK_SET) -fread (bond, sizeof (struct entrada), 1, a007) -printf ("% s t% d t% s n", bond.actor, bond.year, bond.title) -fclose (a007) -Retorno (0) -}

El código que se muestra en buscar un registro específico en un archivo es de nuevo muy similar al código que se muestra en el listado 22-9. La gran adición es la función fseek (), que se muestra en la línea 21. Se establece la posición del cursor de modo que la función fread () que sigue (véase la línea 22) lee en un registro específico localizado dentro de la base de datos.

En la línea 21, la función fseek () examina el archivo representado por mango a007. El desplazamiento se calcula multiplicando el tamaño de la estructura de entrada.

Al igual que con una matriz, multiplicando ese tamaño por 1 da el segundo registro en el Archivo- multiplicar el valor por 0 (o simplemente especifique 0 en la función) para leer el primer registro. La constante SEEK_SET asegura que fseek () empieza a verse desde el principio del archivo.

El efecto neto del código es que se muestra el segundo registro del archivo bond.db.

Ejercicio 2: Escriba el código fuente de buscar un registro específico en un archivo. Genere y ejecute para ver el segundo registro en el archivo.




» » » » Programación C: ¿Cómo acceder a los archivos almacenados en el almacenamiento aleatorio