PortadaCursoc++2-807d212a

La App Makers

Introducción:

Los archivos son un tipo de estructura de datos que persisten, o sea que aunque se apague al ordenador y lo vuelva a prender, los datos van a seguir ahí si quiero buscarlos, a diferencia de los vectores que, por ejemplo, no persisten  si se reinicia el ordenador.

Los archivos o ficheros son la forma en la que C++ permite el acceso al disco. Todos los procesos tienen abiertos, por defecto, los archivos 0(entrada), 1(salida) y 2(salida de errores), de manera que en C++ se corresponden con los objetos cin , cout y cerr .

Los archivos, se almacenan físicamente en el disco duro, ¿Como?,se encargan de su manipulación los Sistemas Operativos.

Indice del Curso

Se ha realizado este curso con la idea que contenga 7 unidades hasta el momento, eso no quiere decir que se vaya anexando otros temas en el futuro.El mismo va tener el siguiente temario. Haz clic en los enlaces de los temas.

¿Como acceder al archivo?

Para poder acceder y manejar un archivo va a ser necesario, en principio, lo que se llama como “un puntero a archivo” o “puntero a file”, y lo vamos a declarar así:

Esta es la forma de enlazar una variable, con un tipo de dato FILE.

Con esto ya tenemos asegurado que vamos a tener un archivo (literalmente un archivo) enlazado en nuestra variable ‘archivo’. Es decir, si borramos el archivo, lo perdemos o lo que sea, no vamos a poder acceder al archivo . Ahora bien, ¿qué podemos hacer con los archivos? Crearlos, borrarlos, abrirlos, cerrarlos, escribirlos, leerlos, etc. Por suerte en C++ ya están estas funciones creadas, solamente necesitas acordarte sus nombre y los parámetros.

Como todo está conectado con todo, vamos a describir las formas y al final dar un ejemplo utilizando todo. La forma en que C++ abre un archivo es la siguiente:

Los modos de apertura de los archivos son: 

Cabe aclarar que no le afecta en nada si se abre un archivo como escritura para leerlo, solamente le quita funcionalidad, pero no afecta al código en sí. Un ejemplo seria así:

Todos esos include son para que C++ entienda las funciones fopen, etc.

Una vez abierto el archivo, podemos leerlo, escribirlo, posicionarnos sobre algún lugar o bien cerrarlo.

Para leerlo existen varias maneras, caracter por caracter(como en archivos de texto) o por bloque de datos (struct o vectores por ejemplo), como en los archivos binarios.

 Antes que nada, cabe aclarar una función útil, llamada fseek() que nos posiciona en alguna parte del archivo, normalmente vamos a querer que nos posicione al inicio, para leer todo el archivo. Se define de la siguiente manera:

fseek(archivo,0,SEEK_SET) //Posiciona al inicio del archivo
fseek(archivo,0,SEEK_END) //Posiciona al final del archivo

Archivos de Texto

Son bastante básicos, en su interior solamente se encuentra caracteres (char, ya sean números char, o letras)(los números char serían: char número =’7’), son los conocidos .txt.

Un resumen de sus utilizaciones son las siguientes:

Para realizar la apertura:

Solo apertura (w) y agregó lectura (+)

Ejemplos:

Cargar un archivo carácter por carácter(hasta 10) y mostrarlo por pantalla.

Fijarse que se hace un while hasta 9, porque antes  le pedimos el primer carácter, y luego vamos colocándolos con el putc() en archivo  escribe en el archivo Ejemplo1.txt. Una vez que termina, lo cerramos, lo volvemos a abrir, se coloca en el principio con fseek(archivo,0,SEEK_SET), y vamos leyendo del archivo de a un carácter con fgetc() y mostrando por pantalla.

y en el archivo Ejemplo1.txt:

Una manera distinta, más prolija y modularizada sería:

El main() está más limpio, sabemos que ingresamos caracteres a un archivo, y que después los imprimimos. ¿Como? No importa, de eso se encarga la función que programamos más arriba.

Además, vean que si nos vamos a la carpeta donde está nuestro proyecto , se nos creó un archivo Ejemplo1.txt con los valores que le escribimos:

Podríamos crear funciones que lean los renglones de cada archivo de texto, o que lo recorra buscando cuántas letras hay, pero ya están creadas en algún lugar en Internet. Queda en cada uno que tanto quiere aprender de Algoritmos.

Archivos Binarios

Los archivos binarios no guardan texto, ni ningún tipo de información que podamos nosotros leer y entender. Estos guardan estructuras de datos (structs, vectores) con dos funciones:

fread() //para leer de un archivo

fwrite() //para escribir en un archivo.

Pero entonces, ya pasamos de tener solamente que manejar un archivo, a tener que manejar un archivo y una estructura de datos, normalmente un struct. Ya son dos cosas que tenemos que empezar a pensarlas en conjunto.

Leamos, entonces, un struct de un archivo (Suponemos que el archivo existe y tiene datos).

Aclaró que fread() devuelve 1 en caso de exito, y llega hasta el End of File(EOF) fin del archivo, en caso de que no haya más cosas para leer del archivo.

En fread() pasamos como primer parámetro la dirección de memoria (&variable : dirección de memoria donde esta la variable) de la variable en la que vamos a guardar el valor leído(es como una variable auxiliar), el tamaño de tipo de dato, cuantos bloques de esa estructura de datos vamos a leer  y el puntero a FILE.

Hay que tener en cuenta que en este caso estoy leyendo TODO UN struct Alumno, no una parte, no una variable, TODO UN struct, y ese mismo struct Alumno lo estoy almacenando en la variable “alumno”.
En cuanto a  structs sabemos manejar, ya podemos tratarlo como cualquier otro struct que hayamos visto, podemos pedirle el valor, reescribirlo, ponerlo en un vector de structs, etc.

Fijense lo que hace cuando usamos fread(). Lee todo el struct 1 del archivo y se lo asigna a la variable alumno y deja el puntero del archivo para leer el struct 2, en caso que lo necesitemos.

Cabe aclarar que podemos hacer cosas del estilo de poner todo ese fread() en un if() a ver si existe o no el archivo; como también meterlo en un while y que lea mientras haya datos por leer.

Usando archivos con un if para ver si existe algo para leer:

Esto solamente nos sirve para corroborar si el archivo tiene al menos un datos para leer. Es decir, si el archivo existe.

No confundirse, cada vez que hacemos un fread(); el valor que tenían anteriormente “alumnos” se pierde. No es que vamos acumulando los structs ni nada parecido.

Vuelvo a decir entonces que &alumno es como un struct auxiliar en el cual deposito lo leído, y a partir de ahí, puedo manipular los datos, accediendo como accedo normalmente a los structs.

Pasemos a grabar/escribir en un archivo con fwrite() que casualmente tiene el mismo formato que fread()

En este caso, estoy escribiendo TODO el struct en el archivo, no una variable, no dos, TODO.

Finalmente, cerrar un archivo, es la función mas fácil.

fclose() cierra el archivo. Necesariamente el archivo tiene que estar abierto.

Un resumen de las funciones en Archivos Binarios

Ejemplo Integrador del tema.

Ahora bien, hagamos un programa que abra un archivo, le podamos escribir unas cosas, lo cerremos, lo volvamos a abrir, las leamos y lo cerremos nuevamente.

Aclaro que me fue necesario utilizar un vector de structs, pero no se mareen, es un vector común y corriente, solo que en vez de manejar un entero o un carácter, maneja un conjunto de datos.

y el resultado será:

y el archivo Estudiantes.dat en el disco se ve así: 

  • Tutorial
  • Programación
0 Comentarios

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos .Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Nuevo informe

Cerrar

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account