Programación 1 Tema 15. Trabajo con ficheros binarios

Documentos relacionados
Examen escrito de Programación 1

Programación 1 Tema 3. Información, datos, operaciones y expresiones

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

#include <fstream.h> ifstream descriptor ( nombre.extensión ); ofstream descriptor ( nombre.extensión );

ALMACENAMIENTO PERSISTENTE DE DATOS

Examen escrito de Programación 1. Jueves 5 de febrero de Problema 1 o (3.5 puntos)

Entrada y salida de datos en C y C++

Prof. Dr. Paul Bustamante

Contenidos. Archivos en C++ Archivos en C++ Introducción

Hoja de ejercicios del Tema 3

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Ficheros: texto y binarios

Elementos de un programa en C

PROGRAMACIÓN ORIENTADA A OBJETOS

Tema 3: Ficheros en C++

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

Programación En Lenguaje C

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Definición de Memoria

Introducción al tipo de dato ARRAY

Uso de archivos en C++

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Pseudolenguaje. (1 byte) (valores códigos ASCII) [CHAR_MIN.. CHAR_MAX] (Definida en <limits.h>) No hay. Dominio n 1 [MIN(C)..

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Informática Ingeniería en Electrónica y Automática Industrial

7. Manejo de Archivos en C.

Programación. Test Autoevaluación Tema 3

INTRODUCCIÓN AL TIPO COMPUESTO CADENA CONTENIDOS

Formatos para prácticas de laboratorio

Prof. Dr. Paul Bustamante

Estructuras de Datos Declaraciones Tipos de Datos

Programación 2. Grado en Estadística Aplicada. Curso Generación de números pseudoaleatorios. Manejo de ficheros de texto.

Ficheros y streams. Desde el punto de vista de Java, cada fichero no es más que una secuencia o flujo de bytes [stream].

1. Juego del Ahorcado

Apuntadores en C y C++

El lenguaje C. 1. Identificadores, constantes y variables

Programación Estructurada

Condicionals en C++ (I)

EXAMEN PARCIAL TRABAJO INTEGRADOR (TI) EVALUACIÓN CONTINUA PESO PORCENTUAL PESO PORCENTUAL 1 30% 06-MAY-14 30% 03-MAY-14 20% 20%

1 Estructura básica de un programa C++

Operadores y Expresiones

TEMA 4. ESTRUCTURAS DE CONTROL

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Funciones. Parámetros por valor

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Tema 2: La clase string

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

1. Qué se muestra en pantalla si se ejecutan las siguientes sentencias (suponiendo que el resto del programa que no se presenta es correcto)?

Lenguajes de programación

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos.

Prof. Dr. Paul Bustamante

Contenido. Capítulo 1. Introducción a lenguaje C 1

Tema: Arreglos de Objetos en C++.

Lenguaje de programación C. Introducción

Introduc)on to Programming (in C++) Ejemplos de tratamiento de secuencia de secuencias. Emma Rollón Departament of Computer Science

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

ESTRUCTURAS REPETITIVAS

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 SUMA

Programación estructurada (Introducción a lenguaje C)

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Lección 2 Introducción al lenguaje C

Resolución de problemas mediante algoritmos

Prof. Dr. Paul Bustamante

Estructuras de Repetición (Repita para)

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

8.1 Un primer bucle FOR Varias formas de utilizar el bucle FOR Calcular el factorial de un número mediante un bucle FOR...

GENERALIDADES DEL LENGUAJE C

Tema 2 Introducción a la Programación en C.

Estructuras de control

Programación I Ficheros de texto

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

Fundamentos de Programción (I)

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

1 ELEMENTOS BASICOS DEL LENGUAJE

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Representación de la información

Fundamentos de programación

ARCHIVOS. 1. Introducción. 2. Definición de archivo. 3. Archivos de acceso secuencial. 4. Gestión de un archivo secuencial de estructuras

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Expresiones y sentencias

Instituto Tecnológico de Celaya

FILE *nombre_puntero_fichero; fopen(char_nombre_archivo,char_modo_apertura ); MODOS DE APERTURA. Abre un archivo de texto para lectura.

Estructuras de Control 3

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Tema 3.- Predicados y sentencias condicionales

Prof. Dr. Paul Bustamante

Estructuras de Control

Manual de turbo pascal

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Elementos léxicos del lenguaje de programación Java

Tema 4: Estructuras de Control Estructura y Contenidos

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Fundamentos de Programación Visual Basic

2.2 Nombres, Ligado y Ámbito

= RETURN =3 7-. ELSE K

Tema 2. Memoria Dinámica. 2.1 Datos estáticos y dinámicos

Transcripción:

Programación 1 Tema 15 Trabajo con ficheros binarios

Índice Ficheros binarios Diferencia con ficheros de texto Herramientas de C++ para trabajar con ficheros binarios Problemas básicos con ficheros binarios Creación Lectura

Ficheros binarios Almacenan una secuencia de datos codificados en binario Cada dato se almacena como un grupo consecutivo de bytes Para cada dato, se utiliza la misma codificación binaria que en la memoria del computador

Ficheros binarios Ejemplo: Un dato de tipo int se almacena en un fichero binario como 4 bytes consecutivos en los que el entero está codificado en binario en complemento a 2.

Ficheros binarios Ventajas Se reduce el tamaño de los ficheros Se facilitan las operaciones de lectura y escritura Simplificación de las instrucciones que es necesario programar Reducción del tiempo de lectura o escritura Desventajas No legibles por seres humanos Pueden aparecer problemas de portabilidad

Diferencias entre un fichero binario y un fichero de texto Interpretación de la secuencia de bytes Estructurado en líneas? Necesidad de separadores entre datos Legible por una persona Fichero de texto Fichero binario Caracteres Codificación interna binaria de datos Sí No Habitualmente, sí Sí Habitualmente, no No

Diferencias entre un fichero binario y un fichero de texto Ejemplo: dato de tipo int 26173 Codificación en un fichero de texto: 00110010 00110110 00110001 00110111 00110011 (Secuencia de bytes 50, 54, 49, 55 y 51) (Secuencia de caracteres de códigos 50, 54, 49, 55 y 51) (Secuencia de caracteres 2, 6, 1, 7 y 3 ) Codificación en un fichero binario: 00111101 01100110 00000000 00000000 (Secuencia de bytes 61, 102, 0 y 0) (4 bytes que codifican el número 26173 en base 2 en complemento a 2, con el byte menos significativo en primer lugar)

Trabajo con ficheros binarios Asociación f.open(const char sec[], ios::binary) Lectura f.read(char sec[], streamsize n) Escritura f.read(reinterpret_cast<char*>(&dato), sizeof(dato)) f.write(const char sec[], streamsize n) f.write(reinterpret_cast<char*>(&dato), sizeof(dato))

Creación de un fichero binario Introduzca un NIP (0 para acabar): 487524 Introduzca una nota: 7.9 Introduzca un NIP (0 para acabar): 454844 Introduzca una nota: 10.0 Introduzca un NIP (0 para acabar): 567896 Introduzca una nota: 6.3 Introduzca un NIP (0 para acabar): 0 prog1.dat <487524, 7.9, 454844, 10.0, 567896, 6.3>

Creación de un fichero binario prog1.dat int: 487524 01100100 01110000 00000111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011111 01000000 00000000 00000000 00000110 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00100100 01000000 01011000 00000000 00001000 00000000 00110011 00110011 00110011 00110011 00110011 00110011 00011001 01000000 double: 7.9

Creación de un fichero binario. Sintaxis <fichero_de_notas> ::= { <nota> <nota> ::= <nip> <calificación> <nip> ::= int <calificación> ::= double

Creación de un fichero binario /* * Pre: --- * Post: Ha creado un fichero binario de * nombre «nombrefichero» compuesto * por una secuencia de pares (NIP, * nota) solicitados * interactivamente al operador. */ void crearficheronotas( const char nombrefichero[]);

Creación de un fichero binario void crearficheronotas(const char nombrefichero[]) { ofstream f; f.open(nombrefichero, ios::binary); if (f.is_open()) { cout << "Introduzca un NIP (0 para acabar): " << flush; int nip; cin >> nip; while (nip!= 0) { cout << "Introduzca una nota: " << flush; double nota; cin >> nota; f.write(reinterpret_cast<char*>(&nip), sizeof(nip)); f.write(reinterpret_cast<char*>(&nota), sizeof(nota)); cout << "Introduzca un NIP (0 para acabar): " << flush; cin >> nip;...

Creación de un fichero binario void crearficheronotas( const char nombrefichero[]) {... f.close(); else { cerr << "No se ha podido escribir en el " << "fichero \"" << nombrefichero << "\"" << endl;

Creación de un fichero binario prog1.dat int: 487524 01100100 01110000 00000111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011111 01000000 00000000 00000000 00000110 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00100100 01000000 01011000 00000000 00001000 00000000 00110011 00110011 00110011 00110011 00110011 00110011 00011001 01000000 double: 7.9

Lectura de un fichero binario prog1.dat <487524, 7.9, 454844, 10.0, 567896, 6.3> NIP Nota ------------ 487524 7.9 454844 10.0 567896 6.3

Lectura de un fichero binario. Sintaxis <fichero_de_notas> ::= { <nota> <nota> ::= <nip> <calificación> <nip> ::= int <calificación> ::= double

Lectura de un fichero binario /* * Pre: «nombrefichero» es el nombre de un fichero existente * binario cuya estructura consiste en una secuencia de * pares (NIP, nota), de tipos int y double, * respectivamente. * Post: Ha mostrado en la pantalla del contenido del fichero de * nombre «nombrefichero», de acuerdo con el siguiente * formato de ejemplo: * * NIP Nota * ------------ * 487524 7.9 * 454844 10.0 * 567896 6.3 */ void mostrarficheronotas(const char nombrefichero[]);

Lectura de un fichero binario void mostrarficheronotas(const char nombrefichero[]) { ifstream f; f.open(nombrefichero, ios::binary); if (f.is_open()) { cout << " NIP Nota" << endl; cout << "------------" << endl; cout << fixed << setprecision(1); int nip; f.read(reinterpret_cast<char*>(&nip), sizeof(nip)); while (!f.eof()) { double nota; f.read(reinterpret_cast<char*>(&nota), sizeof(nota)); cout << setw(6) << nip << " " << setw(5) << nota << endl; f.read(reinterpret_cast<char*>(&nip), sizeof(nip));...

Lectura de un fichero binario void mostrarficheronotas( const char nombrefichero[]) {... f.close(); else { cerr << "No se ha podido leer el " << "fichero \"" << nombrefichero << "\"" << endl;

Problemas con NIF Definición de la sintaxis de un fichero binario que almacena NIF Dos versiones Diseño del código de dos funciones Una función lee los NIF del fichero y los almacena en una tabla Otra escribe en un fichero los NIF presentes en una tabla

Problemas con NIF. Sintaxis del fichero. Alternativa 2 <ficheronifbinarioalt2> ::= <número> { <nif> <número> ::= int <nif> ::= <dni> <letra> <dni> ::= int <letra> ::= char

Problemas con NIF /* * Pre: n>=0 * Post: Crea un fichero de nombre «nombrefichero» en el * que almacena la siguiente información codificada * en binario: En primer lugar el número «n» de * NIFs. Le siguen la secuencia de pares datos * <int, char> que corresponden al DNI y a la letra * de cada Nif almacenado en T[0..n-1]. */ void guardarnifsbinalt2(const char nombrefichero[], Nif T[], int n);

Problemas con NIF void guardarnifsbinalt2(const char nombrefichero[], Nif T[], int n) { ofstream f; // Declara un flujo de salida // Le asocia un fichero binario f.open(nombrefichero, ios::binary); if (f.is_open()) { // Inserta en el flujo «f» el valor binario de «n» f.write(reinterpret_cast<char*>(&n), sizeof(n)); for (int i = 0; i < n; i++) { // Extrae el número de DNI y la letra del registro T[i] int eldni = dni(t[i]); char laletra = letra(t[i]); // Inserta en «f» los valores binarios del DNI y de la letra f.write(reinterpret_cast<char*>(&eldni), sizeof(eldni)); f.write(reinterpret_cast<char*>(&laletra), sizeof(laletra)); f.close(); // Libera el fichero y lo disocia del flujo «f» else { cerr << "..." << endl;

Problemas con NIF void guardarnifsbinalt2(const char nombrefichero[], Nif T[], int n) {... // Inserta en el flujo «f» el valor binario de «n» f.write(reinterpret_cast<char*>(&n), sizeof(n)); for (int i = 0; i < n; i++) { // Extrae el número de DNI y la letra del registro T[i] int eldni = dni(t[i]); char laletra = letra(t[i]); // Inserta en «f» los valores binarios del DNI y la letra f.write(reinterpret_cast<char*>(&eldni), sizeof(eldni)); f.write(reinterpret_cast<char*>(&laletra), sizeof(laletra));...

Problemas con NIF /* * Pre: El fichero de nombre [nombrefichero] almacena la siguiente * información codificada en binario que representa una secuencia * de NIFs: En primer lugar el número de NIFs almacenados en el * fichero; este número es igual o mayor que cero. Le sigue una * secuencia de datos de tipo int y char que representan el * número de DNI y la letra de un NIF. * Post: Asigna a ndatos el número de NIFs almacenados en el fichero y * almacena en T[0..nDatos-1] los NIFs almacenados en el fichero. */ void leernifsbinalt2(const char nombrefichero[], Nif T[], int& ndatos);

Problemas con NIF void leernifsbinalt2(const char nombrefichero[], Nif T[], int& ndatos) { ifstream f; // Declara un flujo de entrada f.open(nombrefichero, ios::binary); // Le asocia un fichero (binario) if (f.is_open()) { f.read(reinterpret_cast<char*>(&ndatos), sizeof(ndatos)); // Lee una secuencia de ndatos NIFs y los almacena en T[0..nDatos-1] for (int i = 0; i < ndatos; ++i) { // Lee el siguiente número de DNI y la letra asociada int eldni; char laletra; f.read(reinterpret_cast<char*>(&eldni), sizeof(eldni)); f.read(reinterpret_cast<char*>(&laletra), sizeof(laletra)); // Crea un NIF con los datos leídos y lo almacena en T[i] T[i] = crearnif(eldni,laletra); f.close(); // Libera el fichero y lo disocia del flujo «f» else { cerr << "No se ha podido leer \"" << nombrefichero << "\"" << endl;

Problemas con NIF void leernifsbinalt2(const char nombrefichero[], Nif T[], int& ndatos) {... f.read(reinterpret_cast<char*>(&ndatos), sizeof(ndatos)); // Lee una secuencia de ndatos NIFs y los almacena en T for (int i = 0; i < ndatos; ++i) { // Lee el siguiente número de DNI y la letra asociada int eldni; char laletra; f.read(reinterpret_cast<char*>(&eldni), sizeof(eldni)); f.read(reinterpret_cast<char*>(&laletra), sizeof(laletra)); // Crea un NIF con los datos leídos y lo almacena en T[i] T[i] = crearnif(eldni,laletra);...

Problemas con NIF. Sintaxis del fichero. Alternativa 1 <ficheronifbinarioalt1> ::= <número> { <nif> <número> ::= int <nif> ::= Nif

Problemas con NIF /* * Pre: n>=0 * Post: Crea un fichero de nombre «nombrefichero» en el * que almacena la siguiente información codificada * en binario: En primer lugar el número «n» de * NIFs. Le siguen la secuencia de datos de tipo * Nif almacenados en T[0..n-1]. */ void guardarnifsbinalt1(const char nombrefichero[], Nif T[], int n);

Problemas con NIF void guardarnifsbinalt1(const char nombrefichero[], Nif T[], int n) { // Declara un flujo de salida ofstream f; // Le asocia un fichero binario f.open(nombrefichero, ios::binary); if (f.is_open()) { // Inserta en el flujo «f» el valor binario de «n» f.write(reinterpret_cast<char*>(&n), sizeof(n)); for (int i = 0; i < n; i++) { // Inserta en «f» el valor binario del registro T[i] f.write(reinterpret_cast<char*>(&t[i]), sizeof(t[i])); f.close(); // Libera el fichero else { cerr << "No se ha podido escribir en el " << endl;

Problemas con NIF void guardarnifsbinalt1(const char nombrefichero[], Nif T[], int n) {... // Inserta en el flujo «f» el valor binario de «n» f.write(reinterpret_cast<char*>(&n), sizeof(n)); for (int i = 0; i < n; i++) { // Inserta en «f» el valor binario del registro T[i] f.write(reinterpret_cast<char*>(&t[i]), sizeof(t[i]));...

Problemas con NIF /* * Pre: El fichero de nombre [nombrefichero] almacena la siguiente * información codificada en binario que representa una secuencia * de NIFs: En primer lugar el número de NIFs almacenados en el * fichero; este número es igual o mayor que cero. Le sigue una * secuencia de datos de tipo Nif. * Post: Asigna a ndatos el número de NIFs almacenados en el fichero y * almacena en T[0..nDatos-1] los NIFs almacenados en el fichero */ void leernifsbinalt1(const char nombrefichero[], Nif T[], int& ndatos);

Problemas con NIF void leernifsbinalt1(const char nombrefichero[], Nif T[], int& ndatos) { // Declara un flujo de entrada ifstream f; // Le asocia un fichero binario f.open(nombrefichero, ios::binary); if (f.is_open()) { f.read(reinterpret_cast<char*>(&ndatos), sizeof(ndatos)); for (int i = 0; i < ndatos; i++) { // Intenta leer el siguiente NIF del fichero f.read(reinterpret_cast<char*>(&t[i]), sizeof(t[i])); f.close(); // Libera el fichero else { cerr << "No se ha podido escribir en el " << endl;

Problemas con NIF void leernifsbinalt1(const char nombrefichero[], Nif T[], int& ndatos) {... f.read(reinterpret_cast<char*>(&ndatos), sizeof(ndatos)); for (int i = 0; i < ndatos; i++) { // Intenta leer el siguiente NIF de «f» f.read(reinterpret_cast<char*>(&t[i]), sizeof(t[i]));...