programación i :: prof. yeniffer peña conceptos avanzados de programación presentación

64
Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Upload: bernardo-parra-vidal

Post on 24-Jan-2016

223 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

:: Prof. Yeniffer Peña

Conceptos Avanzados de ProgramaciónConceptos Avanzados de Programación

Presentación

Page 2: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Definición.

Clasificación de archivos.

Operaciones con archivos.

Unidad I: Conceptos Avanzados de Programación

ARCHIVOS DE DATOS

Page 3: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I El almacenamiento de datos en variables y en arreglos es

temporal; al terminar un programa todos estos datos se pierden.

Muchas aplicaciones requieren escribir o leer información de un dispositivo de almacenamiento auxiliar. Tal información se almacena en estos dispositivos en la forma de un archivo de datos.

Por tanto, los archivos de datos nos permiten almacenar información de modo permanente y acceder y alterar la misma cuando sea necesario.

.

Archivos de Datos

Page 4: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Los archivos se pueden clasificar según el contenido que almacenan en ellos.

Archivos de Datos

Estándar

Bajo Nivel

Archivos de Texto

Archivos sin formato

Formado por caracteres, números y/o símbolos especiales.

Se organizan los datos en bloque de bytes contiguos.

Representan estructuras más complejas (struct, arreglos, objetos).

Están mas relacionados con el sistema operativo del computador.

Page 5: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Los archivos pueden clasificarse según el tipo de acceso

a los datos.

Archivos de Datos

Acceso Secuencial

Los archivos de datos secuenciales se pueden dividir en dos categorías. En la primera categoría están los archivos de texto, que contienen caracteres consecutivos. Estos caracteres pueden interpretarse como datos individuales, como componentes de una cadena de caracteres o como números.

La segunda categoría de archivos de datos secuenciales, a menudo llamados archivos sin formato, organiza los datos en bloques de bytes contiguos de información, con el uso de las estructuras.

Page 6: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Los archivos pueden clasificarse según el tipo de acceso

a los datos.

Archivos de Datos

Acceso Directo

Los registros individuales de un archivo de acceso directo normalmente son de longitud fija y se puede tener acceso a ellos directamente sin tener que buscar a través de campos individuales. Los datos pueden ser insertos en un archivo de acceso directo sin destruir otros datos en el archivo. Los datos almacenados también pueden ser actualizados o borrados, sin tener que reescribir todo el archivo.

Page 7: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I El archivo de cabecera fstream.h define las clases

ifstream, ofstream y fstream para operaciones de lectura, escritura y lectura/escritura en archivos respectivamente.

Para trabajar con archivos debemos crear objetos de éstas clases de acuerdo a las operaciones que deseamos efectuar.

Manejo de Archivos en C++

Escritura en un Archivo

Se declara un objeto de la clase ofstream, después se utiliza la función miembro openopen para abrir el archivo, se escriben en el archivo los datos que sean necesarios utilizando el operador de inserción (<<)operador de inserción (<<) y por último se cierra el archivo por medio de la función miembro closeclose.

Page 8: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Ejemplo: #include <fstream.h>

int main(){ ofstream archivo; // objeto de la clase ofstream

archivo.open("datos.txt");

archivo << "Primera línea de texto" << endl; archivo << "Segunda línea de texto" << endl; archivo << "Última línea de texto" << endl;

archivo.close(); return 0;}

Page 9: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Page 10: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I También se puede invocar la función constructora de la

clase ofstream de tal manera que se abra el archivo sin usar la función open:

Manejo de Archivos en C++

ofstream archivo("datos.txt");

De la misma forma que se utilizan manipuladores de salida para modificar la presentación en pantalla de los datos del programa, igual es posible utilizar éstos manipuladores al escribir datos en un archivo.

Page 11: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Ejemplo:#include <iostream.h>#include <fstream.h>#include <iomanip.h>void main(){ ofstream archivo("Datos2.txt"); // constructor de ofstream int numero;

cout << "Introduzca un numero:" << endl; cin >> numero; archivo << "El valor introducido en base 10 es: " << numero << endl;

archivo << resetiosflags(ios::dec); archivo << setiosflags(ios::oct); archivo << "en base octal es: " << numero << endl; archivo << resetiosflags(ios::oct); archivo << setiosflags(ios::hex); archivo << "y en base hexadecimal es: " << numero << endl; archivo << setiosflags(ios::uppercase|ios::showbase); archivo << "usando manip uppercase y showbase" << " el valor es: " << numero << endl;

archivo << resetiosflags(ios::uppercase|ios::showbase); archivo << resetiosflags(ios::hex); archivo << "Finalmente el valor es " << numero << endl;

archivo.close();}

Page 12: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Page 13: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Al especificar la apertura de un archivo como se ha

mostrado en los ejemplos anteriores, el programa sobreescribe cualquier archivo existente con el mismo nombre en el directorio de trabajo del programa.

Dependiendo del propósito del programa, es posible que sea necesario agregar datos a los ya existentes en el archivo, o quizás sea necesario que las operaciones del programa no se lleven a cabo en caso de que el archivo especificado exista en el disco, para éstos casos se puede especificar el modo de apertura del archivo incluyendo un parámetro adicional en el constructor, cualquiera de los siguientes:

Manejo de Archivos en C++

Page 14: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Parámetro Descripción

ios::app Operaciones de añadidura.

ios::ate Coloca el apuntador del archivo al final del mismo.

ios::in Operaciones de lectura. Esta es la opción por defecto para objetos de la clase ifstream.

ios::out Operaciones de escritura. Esta es la opción por defecto para objetos de la clase ofstream.

ios::nocreate Si el archivo no existe se suspende la operación.

ios::noreplace Crea un archivo, si existe uno con el mismo nombre la operación se suspende.

ios::trunc Crea un archivo, si existe uno con el mismo nombre lo borra.

ios::binary Operaciones binarias.

Page 15: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I De esta manera, se puede modificar el modo de apertura

de un archivo para que los datos se concatenen a los datos existentes en el archivo, esto se hace escribiendo en el constructor:

ofstream archivo("Datos.txt", ios::app);

Si se desea que el programa no sobreescriba un archivo existente se específica en el constructor:

ofstream archivo("Datos.txt", ios::noreplace);

Manejo de Archivos en C++

Page 16: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Lectura de un ArchivoPara abrir un archivo y realizar operaciones de lectura se crea un objeto de la clase ifstream y se procede prácticamente de la misma forma que lo expuesto en el apartado anterior.

Después de abrir el archivo se puede leer su contenido utilizando las funciones miembro de la clase ifstream o bien el operador de extracción (>>)operador de extracción (>>).

Cuando se lee un archivo, por lo general se empieza al principio del mismo y se lee su contenido hasta que se encuentre el final del archivo. Para determinar si se ha llegado al final del archivo se puede utilizar la función miembro eofeof como condición de un bucle while. Además se puede utilizar la función miembro failfail para detectar un error al abrir el archivo.

Page 17: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Ejemplo: #include <fstream.h>

int main(){ ifstream archivo("Pruebas.txt", ios::noreplace); char linea[128]; long contador = 0L;

if (archivo.fail()) cerr << "Error al abrir el archivo Pruebas.txt" << endl; else while(!archivo.eof()) { archivo.getline(linea, sizeof(linea)); cout << linea << endl; if ( (++contador % 24)==0 ) { cout << "CONTINUA..."; cin.get(); } } archivo.close(); return 0;}

Page 18: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

En el ejemplo anterior se utilizó la función miembro fail( )fail( ) para determinar el éxito de la operación de apertura del archivo Pruebas.txt. Esta función produce el valor de 1 si ocurre un error en la operación de archivo.

Similarmente es recomendable utilizar otras funciones para verificar no solo la apertura de archivo sino también las operaciones de lectura y escritura, entre ellas se tienen:

Función Descripción

good Produce un 1 si la operación previa fué exitosa.

eof Produce un 1 si se encuentra el final del archivo.

fail Produce un 1 si ocurre un error.

bad Produce un 1 si se realiza una operación inválida.

Page 19: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Ejemplo:#include <fstream.h>#include <stdlib.h>void main(){ ifstream origen("Pruebas.txt"); char linea[128]; if (origen.fail()) cerr << "Error al abrir el archivo Pruebas.txt" << endl; else { ofstream destino("Copia.txt", ios::noreplace); if (destino.fail()) cerr << "Error al crear el archivo: Copia.txt" << endl; else { while (!origen.eof()) { origen.getline(linea, sizeof(linea)); if (origen.good()) // si lectura ok y if (origen.eof()) // si eof, -> termina exit(1); // el programa else destino << linea << endl; if (destino.fail()) { cerr << "Fallo de escritura en archivo" << endl; exit(1); } } } destino.close(); } origen.close();}

Page 20: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Hasta este punto se han efectuado operaciones, sea de escritura o de lectura en un archivo, pero todavía no se han efectuado ambas operaciones en un mismo archivo.

En ciertas aplicaciones es necesario efectuar operaciones de lectura/escritura en un archivo como es el caso de una base de datos, para esto es necesario crear un objeto de la clase fstreamfstream.

Cuando un programa abre un archivo para operaciones de E/S éste mantiene el registro de dos apuntadores de archivo, uno para operaciones de lectura y otro para operaciones de escritura.

Lectura y Escritura en un Archivo

Page 21: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Hasta este punto se han realizado operaciones secuenciales en los archivos, ya sea para escritura ó lectura de datos, empezando por el principio y continuando hasta el final del mismo.

Las operaciones aleatorias en un archivo no necesariamente inician por el principio del archivo, en lugar de esto es posible desplazarse por el contenido del archivo para realizar una operación de E/S.

Acceso Aleatorio de Archivos

Page 22: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Para mover los apuntadores de archivo a posiciones específicas se utilizan dos funciones seekgseekg y seekpseekp:

seekg( )seekg( ) coloca el apuntador de lectura de archivo en un lugar específico. Se usa con objetos fstream ó ifstream.

seekp( )seekp( ) mueve el apuntador de escritura a una posición específica en el archivo. Se usa con objetos fstream ó ofstream.

seekp(desplazamiento, posicion)

seekg(desplazamiento, posicion)

Acceso Aleatorio de Archivos

Page 23: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

El parámetro desplazamiento especifica la cantidad de bytes que se moverá el apuntador de archivo, puede ser un valor positivo ó negativo. El parámetro posición especifica el lugar del archivo a partir del cual se moverá el apuntador de archivo, de acuerdo a las siguientes banderas.

Acceso Aleatorio de Archivos

Bandera Descripción

ios::beg Desde el principio del archivo

ios::cur Desde la posición actual del apuntador

ios::end Desde el fin del archivo

Page 24: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Ejemplo:#include <fstream.h>int main(){ ofstream archivo("Letras.txt");

for (char letra='A'; letra <='Z'; letra++) archivo << letra;

archivo.close();

return 0;}

Para demostrar las operaciones aleatorias se creará un archivo de texto en donde se puedan efectuar algunas operaciones de E/S.

El código anterior genera un alfabeto en el archivo llamado Letras.txt, que será usado por el siguiente ejemplo:

Page 25: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

#include <fstream.h>int main(){ char letra;

fstream letras("Letras.txt", ios::in|ios::out); letras.seekg(7, ios::beg); // obtiene la letra H letra=letras.get(); letras.seekp(0, ios::end); letras << letra; // coloca la letra al final

letras.seekg(-13, ios::end); // obtiene la letra O letra = letras.get(); letras.seekp(0, ios::end); letras << letra;

letras.seekg(-17, ios::end); // obtiene la letra L letra = letras.get(); letras.seekp(0, ios::end); letras << letra;

letras.seekg(0, ios::beg); // obtiene la letra A letra = letras.get(); letras.seekp(0, ios::end); letras << letra;

letras.close();}

Ejemplo:

Para posicionar el apuntador de lectura de archivo a partir del fin del mismo se utiliza un número negativo y además la lectura avanza hacia el final del archivo.

Page 26: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Para las aplicaciones que requieren gestionar datos de

objetos, sería deseable leer o escribir el objeto entero en lugar de leer y escribir separadamente los datos individuales.

Archivos de Datos

Si todos los registros a almacenar en un archivo, son objetos de una clase en particular y ocupan por ejemplo 100 bytes, el almacenamiento sería así:

0 100

200

300

400

100byte

s

100byte

s

100byte

s

100byte

s

100byte

s

Desplazamientoen bytes

objeto objeto objeto objeto objeto

Page 27: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Para ello, al igual que Lenguaje C, C++ ofrece las funciones miembro de la clase fstream: writewrite y readread.

write (const char *, int);

read (char *, int);

writewrite también es función miembro de la clase ofstream y readread de la clase ifstream.

Archivos de Datos

Page 28: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++class Estudiante{private: char nombre[40]; int edad; float indice;public: void asignar(char * nom, int ed, float ind){ strcpy(nombre,nom); edad=ed; indice=ind; } void mostrar(){ cout<<"Nombre: "<<nombre<<“ Edad: "<<edad<<“ Indice: "<<indice<<endl; }};

void main(){ Estudiante obj1,obj2; obj1.asignar("Luis", 19, 5.22); ofstream archivo1("datos.txt"); archivo1.write( (char *)(&obj1), sizeof(Estudiante)); archivo1.close(); ifstream archivo2("datos.txt"); archivo2.read( (char *)(&obj2), sizeof(Estudiante)); obj2.mostrar(); getch();}

Ejemplo:

Page 29: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

La funcion miembro tellg y tellptellg y tellp retornan la cantidad de bytes que hay desde el principio del archivo hasta donde se encuentra ubicado el puntero del mismo.

tellg( )tellg( ) Se usa con objetos fstream ó ifstream.

tellp( )tellp( ) Se usa con objetos fstream ó ofstream.

tellg()

tellp()

Calcular el tamaño de un archivo

Page 30: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Manejo de Archivos en C++

Para calcular el tamaño de un archivo, ya sea en bytes o en registros se suele usar el siguiente procedimiento:

Calcular el tamaño de un archivo

long nRegistros; long nBytes;

ifstream archivo(“datos.txt”);

// Colocar el cursor al final del fichero archivo.seekg(0, ios::end);

// Tamaño en bytes nRegistros nBytes = archivo.tellg();

// Tamaño en registros nRegistros= archivo.tellg() / sizeof(ClaseRegistro);

Page 31: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Cuando se trabaja con archivos en Lenguaje C, el primer paso es establecer el área del búffer, donde la información se almacena temporalmente, mientras se transfiere información entre la aplicación y el archivo almacenado en algún dispositivo de almacenamiento auxiliar.

Archivos de Datos en Lenguaje C

Aplicación en Lenguaje C

Memoriapara

establecer el área de

búffer

archivo

Dispositivos de almacenamiento auxiliar

Page 32: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

FILE *ptfile;

Variable puntero que indica el principio del área del buffer

El archivo debe ser abierto para asociar el nombre del archivo con el área del búffer. También se especifica cómo se va a usar el archivo.

Apertura de un Archivo

ptfile = fopen(nombre_archivo, tipo_archivo);

Esto se hace, declarando una variable puntero del tipo de estructura FILE que maneja C y luego se procede a abrir el archivo.

Archivos de Datos en Lenguaje C

Page 33: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Valores válidos para el tipo de uso de un archivo con fopen

Generalizando:

Modo Significado

“r” Apertura de un archivo para lectura

“w” Creación de un archivo para escritura

“a” Adición por el final en un archivo

Archivos de Datos en Lenguaje C

Page 34: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Modo Significado

“r” Apertura de un archivo para lectura

El puntero al archivo se posiciona al inicio del archivo.

Si el archivo No existe arroja el correspondiente error.

“w” Creación de un archivo para escrituraEl puntero al archivo se posiciona al inicio del archivo. Crea el archivo de tal forma que si este existe es reemplazado.

“a” Adición por el final en un archivoEl puntero al archivo se posiciona al final del archivo. Si el archivo No existe, crea uno nuevo.

Archivos de Datos en Lenguaje C

Page 35: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Valores válidos para el tipo de uso de un archivo con fopen

Archivos binarios:

Modo Significado“rb” Apertura de un archivo binario para lectura“wb” Creación de un archivo binario para escritura“ab” Adición por el final en un archivo binario“rb+” o “r+b” Apertura de un archivo binario para lect/esc“wb+” o “w+b” Creación de un archivo binario para lect/esc“ab+” o “a+b” Apertura de un archivo binario para lect/esc

Archivos de Datos en Lenguaje C

Page 36: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Un archivo debe cerrarse, aunque la mayoría de los compiladores de C cierran los archivos al finalizar la ejecución del programa.

Cierre de un Archivo

fclose(ptfile);

Ejemplo: #include “stdio.h” main() { FILE *ptfile; ptfile = fopen(“ejemplo.dat”, “wb”); if (ptfile == 0) printf(“ERROR...”); else { //manipulacion del archivo fclose(ptfile); }}

Archivos de Datos en Lenguaje C

Page 37: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I FILE * ptfile;

ptfile = fopen(“ejemplo.dat”, “wb”);

Archivos de Datos en Lenguaje C

Page 38: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

FILE * ptfile;ptfile = fopen(“C:\\ejemplo.txt”, “w”);

Otros ejemplos, de apertura de archivos.

FILE * ptfile;ptfile = fopen(“C:\\Ejemplos\\ejemplo.dat”, “rb”);

FILE * ptfile;char ruta[]=“C:\\Ejemplos\\”;ptfile = fopen(strcat(ruta,”ejemplo.dat”), “a”);

Archivos de Datos en Lenguaje C

Page 39: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Algunas aplicaciones involucran el uso de archivos para almacenar bloques de datos, donde cada bloque consiste en un número de bytes contiguos.

Cada bloque representará una estructura de datos compleja, como una estructura (struct en C) ó arreglos. Por ejemplo se podrían almacenar registros de clientes:

typedef struct{ char nombre[88]; 88 bytes int no_cuenta; 4 bytes float saldo; 8 bytes} registro; 100 bytes

registro cliente;

Para saber cuánto ocupa en bytes cada registro:printf(“Bytes = %d”, sizeof(registro) );

Archivos de Datos en Lenguaje C

Page 40: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Si todos los registros a almacenar en un archivo, son del

tipo de la estructura declarada anteriormente (registro), el almacenamiento en bytes sería así:

0 100

200

300

400

100byte

s

100byte

s

100byte

s

100byte

s

100byte

s

Desplazamientoen bytes

registro

registro

registro registro

registro

Archivos de Datos en Lenguaje C

Page 41: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Para las aplicaciones que requieren gestionar datos como la estructura de registro declarada anteriormente, sería deseable leer o escribir el bloque entero en lugar de leer y escribir separadamente los datos individuales.

Para ello , las funciones de biblioteca utilizadas son fwritefwrite y freadfread.

Archivos de Datos en Lenguaje C

Page 42: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

fread Permite leer cuenta número de objetos, cada uno de tam bytes de longitud, del archivo apuntado por la variable ptfile y los sitúa en el búfer apuntado por buf. Devuelve el número de elementos realmente leídos.

size_t fread (void *buf, size_t tam, size_t cuenta, FILE *ptfile)

fwrite Permite escribir cuenta objetos, cada uno de tam bytes de longitud, en el archivo apuntado por la variable ptfile desde el búfer apuntado por buf. Devuelve el número de elementos realmente escritos.

size_t fwrite (const void *buf,size_t tam,size_t cuenta,FILE *ptfile)

Archivos de Datos en Lenguaje C

Page 43: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I #include “stdio.h”

#include “string.h”typedef struct{ char nombre[88]; int no_cuenta; float saldo;}registro;

Ejemplo: Crear un archivo de datos sin formato que contiene registros de clientes.

void main() { registro cliente; FILE *ptfile; ptfile = fopen(“ejemplo.bin”, “wb”); /*Abrir archivo binario solo para esc.*/

printf (“\nIngrese el Nombre:”); gets(cliente.nombre); printf(“\nIngrese el Numero de cuenta: ”); scanf(“%d”, &cliente.no_cuenta); printf(“\nIngrese el Saldo: ”); scanf(“%f”, &cliente.saldo);

fwrite (&cliente, sizeof(registro), 1, ptfile); fclose(ptfile); }

Archivos de Datos en Lenguaje C

Page 44: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Si se introducen los siguientes datos: Nombre: Yeniffer Numero de cuenta: 12345 Saldo: 1000

Archivos de Datos en Lenguaje C

Page 45: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I #include “stdio.h”

#include “string.h”typedef struct{ char nombre[88]; int no_cuenta; float saldo;}registro;

Ejemplo: Leer de un archivo de datos sin formato registros de clientes.

void main() { registro cliente; FILE *ptfile; ptfile = fopen(“ejemplo.bin”, “rb”); /*Abrir archivo binario solo para lectura*/

fread (&cliente, sizeof(registro), 1, ptfile); printf (“\nNombre: %s”, cliente.nombre); printf(“\nNumero de cuenta: %d”, cliente.no_cuenta); printf(“\nSaldo: %.2f”, cliente.saldo);

fclose(ptfile); }

Archivos de Datos en Lenguaje C

Page 46: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Funciones relacionadas

feof(ptfile)

rewind(ptfile)

fseek(ptfile, desplazamiento_bytes, origen)

ftell(ptfile)

??¿ ¿

Chequea si el puntero llegó al final del archivo.

Ubica el puntero al principio del archivo.

Ubica el puntero en el sitio donde se le indique. EL argumento origen puede ser: SEEK_SET, SEEK_CUR, SEEK_END

Retorna la cantidad de bytes que hay desde el principio del archivo hasta donde se encuentra ubicado el puntero.

Archivos de Datos en Lenguaje C

Page 47: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h”#include “string.h”typedef struct{ char nombre[88]; int no_cuenta; float saldo;}registro;

Ejemplo de rewind:

void main() { registro cliente, aux; FILE *ptfile; ptfile = fopen(“ejemplo.bin”, “ab+”); /*Abrir archivo binario para lect/esc.*/ strcpy(cliente.nombre,”Yeniffer”); cliente.no_cuenta=12345; cliente.saldo=1000.0f; if (ptfile!=0) fwrite (&cliente, sizeof(registro), 1, ptfile); rewind(ptfile);rewind(ptfile); fread (&aux, sizeof(registro), 1, ptfile); printf(“Nombre:%s Cuenta:%d Saldo:%.2f”, aux.nombre, aux.no_cuenta, aux.saldo); fclose(ptfile); }

Archivos de Datos en Lenguaje C

Page 48: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h”#include “string.h”typedef struct{ char nombre[88]; int no_cuenta; float saldo;}registro;

Ejemplo de fseek:

void main() { registro cliente[2], aux; FILE *ptfile; ptfile = fopen(“ejemplo.bin”, “ab+”); /*Abrir archivo binario para lect/esc.*/ strcpy(cliente[0].nombre,”Yeniffer”); strcpy(cliente[1].nombre,”Juan”); cliente[0].no_cuenta=12345; cliente[1].no_cuenta=67890; cliente[0].saldo=1000.0f; cliente[1].saldo=2000.0f; if (ptfile!=0) fwrite (cliente, sizeof(registro), 2, ptfile); fseek(ptfile, sizeof(registro), SEEK_SET);fseek(ptfile, sizeof(registro), SEEK_SET); fread (&aux, sizeof(registro), 1, ptfile); printf(“Nombre:%s Cuenta:%d Saldo:%.2f”, aux.nombre, aux.no_cuenta, aux.saldo); fclose(ptfile); }

fseek(ptfile, -sizeof(registro), SEEK_CUR);Probar también:

Archivos de Datos en Lenguaje C

Page 49: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I #include “stdio.h”

#include “stdlib.h”main() { FILE *ptfile; float Arr1[5] = { 1.1F, 2.2F, 3.3F, 4.4F, 5.5F }; float Arr2[5]={0.0F, 0.0F,0.0F,0.0F,0.0F}; int i;

ptfile = fopen(“ejemplo.bin”, “wb+”); /*Crear archivo binario para lect/esc*/ if ( fwrite (Arr1, sizeof(float), 5, ptfile) != 5 ) printf(“\nERROR de escritura en el archivo”); rewind(ptfile);rewind(ptfile); if ( fread (Arr2, sizeof(float), 5, ptfile) != 5 ) { if ( feof (ptfile) ) printf(“\nERROR Fin del archivo”); else printf(“\nERROR de lectura en el archivo”); } fclose(ptfile);

for ( i=0; i<5; i++ ) printf (“%f”, Arr2[i]);}

Otro Ejemplo de cómo se pueden usar estas funciones:

Archivos de Datos en Lenguaje C

Page 50: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Valores válidos para el tipo de uso de un archivo con fopen

Archivos de Texto:

Modo Significado

“r” Apertura de un archivo de texto para lectura

“w” Creación de un archivo de texto para escritura

“a” Adición por el final en un archivo de texto

“r+” Apertura de un archivo de texto para lect/esc

“w+” Creación de un archivo de texto para lect/esc

“a+” Apertura de un archivo de texto para lect/esc

Archivos de Datos en Lenguaje C

Page 51: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Creación de un ArchivoSi el archivo consta de caracteres individuales, se pueden usar las funciones de biblioteca putc y getc. De esta manera podemos escribir datos en el archivo y también leerlos.

#include “stdio.h” main() { FILE *ptfile; char c; ptfile = fopen(“ejemplo.txt”, “w”); /*Abrir solo para escritura*/ do putc(c=getchar(),ptfile); while(c!= ‘\n’); fclose(ptfile); }

Ejemplo: Leer una línea de texto y escribirla en un

archivo

Archivos de Datos en Lenguaje C

Page 52: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h” main() { FILE *ptfile; char c; ptfile = fopen(“ejemplo.txt”, “r”); /*Abrir solo para lectura*/ do putchar(c=getc(ptfile)); while(c!= ‘\n’); fclose(ptfile); }

Ejemplo: Leer una línea de texto de un archivo y

escribirla en pantalla

Archivos de Datos en Lenguaje C

Page 53: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

//Escritura y Lectura carácter a carácter#include <stdio.h>#include <conio.h>void main(){ FILE *archivo; char caracter; clrscr(); archivo=fopen("letras.txt","w"); for (caracter='A'; caracter<='Z'; caracter++) fputc(caracter,archivo);

rewind(archivo);rewind(archivo);

for (int i=1;i<=26; i++) { caracter=fgetc(archivo); printf("%c ",caracter); } fclose(archivo); printf ("\n\nPresione una Tecla para Continuar"); getch();}

Archivos de Datos en Lenguaje C

Page 54: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

//Escritura y Lectura de un dígito entero#include <stdio.h>#include <conio.h>void main(){ FILE *archivo; int num,i; clrscr(); archivo=fopen("numero.txt","w"); for (num=0; num<10; num++) putw(num,archivo); fclose(archivo); archivo=fopen("numero.txt","r"); for (int num=0; num<10; num++) { i=getw(archivo); printf("%4d",i); } fclose(archivo); printf ("\n\nPresione una Tecla para Continuar"); getch();}

Archivos de Datos en Lenguaje C

Page 55: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Los archivos de datos que contienen sólo cadena de caracteres (TEXTO) pueden crearse y leerse más fácilmente con programas que utilizan funciones de biblioteca especialmente orientadas para cadenas de caracteres.

fgets y fputs: intercambian cadenas con archivos.

int fputs (const char *cad, FILE *ptfile)Escribe el contenido de la cadena apuntada por cad en el archivo especificado por la variable ptfile.

char *fgets (char *cad, int num, FILE *ptfile)Lee hasta num-1 caracteres del archivo especificado por la variable ptfile y los sitúa en el arreglo de caracteres apuntador por cad.

Archivos de Datos en Lenguaje C

Page 56: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h” main() { FILE *ptfile; char *universidad=“Universidad Nacional Experimental del Tachira”; ptfile = fopen(“ejemplo.txt”, “w”); /*Crear solo para escritura*/ if( ptfile!=0 ) fputs(universidad, ptfile);

fclose(ptfile); }

Archivos de Datos en Lenguaje C

Page 57: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h” main() { FILE *ptfile; char cad[50]; ptfile = fopen(“ejemplo.txt”, “r”); /*Abrir solo para lectura*/ while ( !feof (ptfile) ){ if (fgets(cad, 50, ptfile)) printf (“%s”, cad); } fclose(ptfile); }

/*Devuelve puntero nulo si hay error*/

Archivos de Datos en Lenguaje C

Page 58: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Otros archivos de datos contienen registros cuya información combina datos numéricos y de carácter. Estos se pueden procesar usando las funciones fscanf y fprintf que permiten darle formato a los datos.

fscanf Permite leer un dato con formato desde un archivo de

datos asociado.int fscanf (FILE *ptfile, const char *formato, ... variables)

Devuelve el número de argumentos a los que realmente se les ha asignado el valor

fprintf Permite escribir datos con formato en el archivo de

datos.int fprintf (FILE *ptfile, const char *formato, ... variables)

Devuelve un valor igual al número de caracteres realmente escrito.

Archivos de Datos en Lenguaje C

Page 59: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h”#include “string.h”typedef struct{ char nombre[88]; int no_cuenta; float saldo;} registro;FILE *ptfile;void main() { registro cliente; int sw = 1; ptfile = fopen(“ejemplo.txt”, “w”); /*Crear solo para escritura*/ while (sw) { fflush(stdin); printf (“\nIngrese un Nombre o FIN para terminar: ”); gets(cliente.nombre); fprintf (ptfile, “%s\n”, cliente.nombre); if ( strcmpi(cliente.nombre,”FIN”) == 0 ) break; printf(“\nNumero de cuenta: ”); scanf(“%d”, &cliente.no_cuenta); printf(“\nSaldo: ”); scanf(“%f”, &cliente.saldo); fprintf (ptfile, “%d\n”, cliente.no_cuenta); fprintf (ptfile, “%.2f\n”, cliente.saldo); } fclose(ptfile); }

Archivos de Datos en Lenguaje C

Page 60: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I Después de ejecutar el programa y de introducir 2 registros, se

crea el archivo ejemplo.txt conteniendo la siguiente información:

Archivos de Datos en Lenguaje C

Page 61: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include “stdio.h”#include “string.h”typedef struct{ char nombre[88]; int no_cuenta; float saldo;} registro;FILE *ptfile;void main() { registro cliente; ptfile = fopen(“ejemplo.txt”, “r”); /*Abrir solo para escritura*/ while ( !feof(ptfile) ) { fscanf (ptfile, “%[^\n]\n”, cliente.nombre); fscanf (ptfile, “%d\n”, &cliente.no_cuenta); fscanf (ptfile, “%f\n”, &cliente.saldo); if ( strcmpi(cliente.nombre,"FIN")!=0 ) printf (“\nNombre:%s \tCuenta:%d \tSaldo:%.2f”,cliente.nombre, cliente.no_cuenta, cliente.saldo); } fclose(ptfile); getch(); }

Archivos de Datos en Lenguaje C

Page 62: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Después de ejecutar el programa anterior su salida en pantalla es la siguiente:

Archivos de Datos en Lenguaje C

Page 63: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

#include "stdio.h"#include "conio.h"#include "stdlib.h“

void main( ){ char cadena[11]; FILE *ptfile; int numero; int long desplaza; ptfile=fopen(“numeros.txt”, “wb+”); fprintf(ptfile, “%s”, “123456789ABCDEFGHIJK”); clrscr(); desplaza=7; fseek(ptfile, desplaza, SEEK_SET); //SEEK_SET=0,SEEK_CUR=1,SEEK_END=2 printf(“Posicion: %d \n”, ftell(ptfile) ); fgets(cadena, 6, ptfile); printf(“cadena = %s \n”, cadena); printf(“Al leer el puntero pasa a la siguiente posicion \n”); printf(“Posicion: %d \n”, ftell(ptfile) ); fclose(ptfile); getch(); remove (ptfile); //Elimina el archivo físicamente}

Posicion: 7

cadena = 89ABC

Posicion: 12

Ejemplo de fseek (Acceso Directo):

Archivos de Datos en Lenguaje C

Page 64: Programación I :: Prof. Yeniffer Peña Conceptos Avanzados de Programación Presentación

Pro

gra

mació

n I

Archivos de Datos

Conceptos Avanzados de ProgramaciónConceptos Avanzados de Programación