Inicio Noticias Fundamental C - Archivo de acceso aleatorio

Fundamental C – Archivo de acceso aleatorio

Artículo principal de Index C – Actualizaciones de archivos de acceso aleatorio

Página 1 de 2

Este extracto, de mi libro sobre programación C en un contexto de IoT, explica cuán fáciles son los archivos de acceso aleatorio en C y cuán fácil es implementar una base de datos simple. .


C fundamental: acercarse al coche

Ahora disponible como libro de tapa blanda y libro electrónico de Amazon.

Acerca de C
Extraer Empleado v Independiente
& Comportamiento indefinido Primeros pasos con C Uso de estructuras de control NetBeans y variables de datos
Extraer variables aritméticas y representación
Extraer operadores y expresiones aritméticas y de representación
Extraer efectos secundarios, puntos de secuencia y evaluación perezosa
Primer borrador de este capítulo: Alcance de las funciones de datos de bajo nivel y matrices de duración
Extraer arreglos simples
Extraer cadenas de enumeración
Extraer punteros simples a cadenas
Extraer los punteros de inicio
Extraiga punteros, moldee y escriba Punning Structs
Extraer estructuras básicas
Extraer tipo de definición
Manipulación de bits
Extraer bits básicos
Extraer giros y rotaciones
Expediente
Extrae los archivos
Extraer archivos de acceso aleatorio *** NUEVO

Compilación C: preprocesador, compilador, enlazador
Extracto de compilación y preprocesador



Ver también el volumen complementario: Aplicación de C

La administración de archivos es un área difícil porque la provisión de archivos y el acceso a los archivos es responsabilidad del sistema operativo y, por lo tanto, no puede ser verdaderamente independiente de la plataforma. Sin embargo, C proporciona algunas funciones estándar de administración de archivos en la biblioteca estándar y aquí es donde comienza, independientemente de la máquina o el sistema operativo.

Todo el tema de la gestión de archivos y la E/S de archivos es muy amplio y hay muchas funciones involucradas en la conversión de formato, etc., que no tenemos espacio para cubrir. Una vez que haya visto las funciones básicas y más utilizadas, el resto es bastante fácil de entender.

También hay un segundo conjunto de comandos de administración de archivos que se encuentran en los sistemas Linux y Unix: el descriptor de archivos, que se trata en Aplicación de C para IoT con Linux.

En el capítulo pero no en este extracto

Idea de archivo Archivo básico Modo de texto Archivos binarios Estructuras como registros Búfer de E/S de caracteres

Funciones de posicionamiento

Al abrir un archivo, la posición de lectura o escritura se encuentra al principio del archivo. Al leer o escribir, el puntero del archivo a la posición actual en el archivo se mueve al siguiente byte para leer o escribir. Esto es lo que significa un archivo secuencial: leer y escribir un byte tras otro. Originalmente los archivos se almacenaban en cinta magnética y se trabajaba desde el principio hasta el final de la cinta. Si deseaba volver a leer la cinta o leer lo que acababa de escribir, se rebobinaba la cinta. También puede rebobinar un archivo C general usando la función:

rebobinar (ftr);

esto mueve el puntero de ubicación del archivo al principio del archivo.

No todas las secuencias se pueden rebobinar o posicionar. Los archivos almacenados en disco o similar generalmente permiten la ubicación y generalmente se los conoce como archivos de acceso aleatorio.

De manera más general, puede moverse a cualquier posición en el archivo usando:

fseek (fptr, desplazamiento, por lo tanto);

donde desplazamiento es el número de bytes desde los que desea mover el puntero y desde dónde es la posición desde la que se mide el desplazamiento. Si desde donde es SEEK_SET, el desplazamiento es desde el principio del archivo, si es SEEK_CUR es desde la posición actual y si es SEEK_END es desde el final del archivo. La función devuelve 0 si la búsqueda funcionó.

Puede averiguar dónde está utilizando el puntero de ubicación:

ftell (fptr);

que devuelve la posición o -1 si la transmisión no tiene una posición.

Para los sistemas POSIX, ftell y fseek funcionan tanto para archivos binarios como de texto. En sistemas incompatibles, solo se puede confiar en ellos para archivos binarios. Para archivos de texto, lo mejor que puede hacer es usar ftell para recuperar una ubicación y luego usar ese valor en fseek para regresar a esa ubicación.

Errores de fin de archivo

Si intenta leer más allá del final actual de un archivo, las funciones de archivo devuelven un valor EOF, que suele ser -1. El problema es que también devuelven EOF por errores de archivo. Para probar un EOF verdadero, debe usar:

feof (ftr);

que devuelve un valor distinto de cero si el archivo se coloca al final del archivo.

También puedes usar:

ferroso (ftr);

que devuelve un valor distinto de cero para un error de archivo general.

Tenga en cuenta que buscar más allá del final del archivo no desencadena un EOF. En efecto, una búsqueda borra todas las banderas EOF que se han establecido.

Acceso aleatorio

Lo que puede hacer con un archivo cuando usa fseek depende de cómo se abrió el archivo.

Si el archivo se abrió únicamente para lectura, puede moverse por el archivo, leer con éxito todos los bytes que le interesan e interpretarlos de la manera que desee. También puede volver a leer cualquier parte del archivo con la frecuencia que necesite. También es obvio que la posición establecida debe estar entre el principio y el final del archivo.

Si el archivo se abrió exclusivamente para escribir, puede moverse a una ubicación ya escrita o al final del archivo donde se pueden agregar nuevos datos para ampliar el archivo. En los sistemas compatibles con POSIX, también puede ir más allá de EOF y escribir datos allí. Los datos entre el final del archivo y los datos recién escritos se leerán como ceros. Esto no es parte de ningún estándar C que, en cambio, especifica que puede reescribir los datos tantas veces como desee, pero que solo puede agregar nuevos datos al final del archivo.

Las cosas se complican un poco más si el archivo está abierto tanto para lectura como para escritura. En este caso, aún puede reescribir los datos existentes y agregar nuevos datos al final del archivo. Si es compatible con POSIX, también puede buscar más allá del final del archivo. Sin embargo, si pasa de leer a escribir, debe tener en cuenta los efectos del almacenamiento en búfer. Básicamente, si pasa de escribir a leer, debe asegurarse de que el búfer esté vacío. El estándar C99 dice que si sigue una escritura desde una lectura, debe haber una llamada intermedia para fflush, fseek, fsetpos o rewind. Cambiar entre lectura y escritura es más fácil, pero aún se requiere una llamada a fseek, fsetpos o rebobinar primero, a menos que ya esté al final del archivo. Si sigue inmediatamente una escritura desde una lectura o una lectura desde una escritura, se desencadena un comportamiento indefinido.

La apertura de un archivo para lectura y escritura y el uso de funciones de posicionamiento facilitan la creación de un archivo de acceso aleatorio orientado a registros, una base de datos simple.

La idea es escribir un archivo de registro basado en la estructura. Por ejemplo, para escribir diez registros de nombre y edad podrías usar:

estructura persona yo; strcpy (nombre.yo, «Harry»); edad promedio = 18; ARCHIVO * f = fopen («miArchivo.bin», «wb +»); for (int i = 0; i <10; i ++) {fwrite (& me, sizeof (struct person), 1, f); yo.edad ++; }; al ras (f);

Como estamos escribiendo registros consecutivos, no es necesario colocar archivos y tenga en cuenta que cada registro tiene más de un año para que pueda controlar qué registro se está leyendo.

Ahora supongamos que queremos leer el quinto registro. Obviamente, esto se almacena en un desplazamiento desde el inicio del archivo de 5 * sizeof (estructura persona) y así es como puede mover la posición del archivo a la posición correcta antes de leer la estructura:

registro int = 5; fseek (f, record * sizeof (estructura persona), SEEK_SET); estructura de persona me2; fread (& me2, tamaño de (estructura persona), 1, f); printf («% s% d», me2.nombre, me2.edad);

Marc Gomez
Vine a por tabaco y ya me quedé aquí. Cuando no estoy en el sótano de Tecnopasion suelo pasear por las calles de Barcelona.
RELATED ARTICLES