Está en la página 1de 23

Ficheros

1. [001.txt] Ficheros
Define una clase Empleado que represente a un empleado, con nombre, dni y sueldo.
Define 3 instancias de la clase y hazlas apuntar desde un array de 3 punteros a Empleado
Pide los datos de los tres objetos al usuario mezclando el extractor, get() y getline() Recuerda que debes
usar getline() para cadenas de varias palabras.
Resuelve el problema de que el extractor deje pendiente el intro final descartándolo con ignore()
Escribe los tres objetos en un fichero binario llamado “empleados.dat’’
Lee el contenido del fichero mostrándolo cada empleado por pantalla (usa un insertor sobrecargado para
ello)
Vuelve a leer el fichero y muestra en pantalla solamente los que tengan un sueldo superior a 1000
Vuelve a leerlo pero rebajándoles el sueldo a 700, pero solamente a los que contengan una ’a’ en su nombre.
Copia en un nuevo fichero nomina.dat solamente los nombres y los sueldos de cada trabajador.

Solución:

#include <f s t r e a m >


#include <i o s t r e a m >
#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
const int TAM NOMBRE( 3 0 ) ;
const int TAM DNI( 1 5 ) ;
struct Empleado {
char nombre [TAM NOMBRE] ;
char d n i [ TAM DNI ] ;
float s a l a r i o ;
};
ostream & operator << ( ostream & out , Empleado empl ) ;
i s t r e a m & operator >> ( i s t r e a m & in , Empleado & empl ) ;
void g u a r d a r P l a n t i l l a ( Empleado ∗ empleados [ ] , int numEmpleados ) ;
void d e c S a l a r i o ( char l e t r a , int m i n S a l a r i o ) ;
void guardarSoloNombresYSueldos ( Empleado ∗ empleados [ ] , int numEmpleados ) ;
int indexOfChar ( char ∗ s , char c ) { int i n d e x = 0 ;
while ( ∗ s ) {
i f ( ∗ s == c ) {
return i n d e x ;
} else {
i n d e x++;
s++;
}
}
return −1; // no e s t a
}
int main ( ) {
Empleado ∗ empleados [ 3 ] ;
Empleado juan , c a r l o s , manuel ;
empleados [ 0 ] = &juan ;
empleados [ 1 ] = &c a r l o s ;
empleados [ 2 ] = &manuel ;
f or ( int n= 0 ; n<3; n++){
c i n >> ∗ empleados [ n ] ;
}
g u a r d a r P l a n t i l l a ( empleados , 3 ) ;
d e c S a l a r i o ( ’ a ’ , 700) ;

Página 1 de 23
Ficheros

guardarSoloNombresYSueldos ( empleados , 3 ) ;
}
ostream & operator << ( ostream & out , Empleado empl ) {
out << ”Nombre : ” << empl . nombre << e n d l ;
out << ”DNI : ” << empl . d n i << e n d l ;
out << ” S a l a r i o : ”<< empl . s a l a r i o << e n d l ;
return out ;
}
i s t r e a m & operator >> ( i s t r e a m & in , Empleado & empl ) {
c o u t << ” S a l a r i o : ”<< e n d l ;
i n >> empl . s a l a r i o ;
in . ignore () ;
c o u t << ”Nombre : ”<< e n d l ;
i n . g e t l i n e ( empl . nombre , TAM NOMBRE) ;
c o u t << ”DNI : ”<< e n d l ;
i n . g e t l i n e ( empl . dni , TAM DNI) ;
return i n ;
}
void g u a r d a r P l a n t i l l a ( Empleado ∗ empleados [ ] , int numEmpleados ) {
f s t r e a m f i c h e r o ( ” empleados . dat ” , i o s : : out | i o s : : b i n a r y ) ;
if (! fichero ) {
c o u t << ” El f i c h e r o no puede a b r i r s e para gu ar d ar p l a n t i l l a ” << e n d l ;
return ;
}
f or ( int n= 0 ; n<3; n++){
i f ( empleados [ n]−> s a l a r i o > 1 0 0 0 ) {
f i c h e r o . w r i t e ( ( char ∗ ) empleados [ n ] , s i z e o f ( Empleado ) ) ;
}
}
fichero . close () ;
}
void guardarSoloNombresYSueldos ( Empleado ∗ empleados [ ] , int numEmpleados ) {
f s t r e a m f i c h e r o ( ” nomina . dat ” , i o s : : out | i o s : : b i n a r y ) ;
if (! fichero ){
c o u t << ” El f i c h e r o no puede a b r i r s e para gu ar d ar nombres y s u e l d o s ” <<
endl ;
return ;
}
f or ( int n= 0 ; n<3; n++){
f i c h e r o . w r i t e ( ( char ∗ ) empleados [ n]−>nombre , TAM NOMBRE ∗ s i z e o f ( char ) ) ;
f i c h e r o . w r i t e ( ( char ∗ ) &empleados [ n]−> s a l a r i o , s i z e o f ( f l o a t ) ) ;
}
fichero . close () ;
}
void d e c S a l a r i o ( char l e t r a , int n e w S a l a r i o ) {
s tr eampos p o s i c i o n ;
Empleado empl ;
fstream f i c h e r o ;
f i c h e r o . open ( ” empleados . dat ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
if (! fichero ){
c o u t << ” El f i c h e r o no puede a b r i r s e para a c t u a l i z a r ” << e n d l ;
return ;
}
f i c h e r o . s e e k g ( 0 , i o s : : beg ) ;
while ( ! f i c h e r o . e o f ( ) ) {
posicion = fichero . t e l l g () ;
f i c h e r o . r e a d ( ( char ∗ )&empl , s i z e o f ( Empleado ) ) ;

Página 2 de 23
Ficheros

i f ( indexOfChar ( empl . nombre , l e t r a ) != −1){


empl . s a l a r i o= n e w S a l a r i o ;
f i c h e r o . seekp ( p o s i c i o n ) ;
f i c h e r o . w r i t e ( ( char ∗ ) &empl , s i z e o f ( Empleado ) ) ;
}
}
fichero . close () ;
}
void m o s t r a r f i c h e r o ( ) {
Empleado empl ;
fstream f i c h e r o ;
f i c h e r o . open ( ” empleados . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
if (! fichero ){
c o u t << ” El f i c h e r o no puede a b r i r s e para l e e r ” << e n d l ;
return ;
}
while ( f i c h e r o . r e a d ( ( char ∗ )&empl , s i z e o f ( Empleado ) ) && ! f i c h e r o . e o f ( ) ) {
c o u t << e n d l ;
c o u t << ” Empleado : ” << e n d l ;
c o u t << empl ;
c o u t << e n d l ;
}
fichero . close () ;
}
void m o s t r a r f i c h e r o ( int sueldoMinimo ) {
Empleado empl ;
fstream f i c h e r o ;
f i c h e r o . open ( ” empleados . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
if (! fichero ){
c o u t << ” El f i c h e r o no puede a b r i r s e para l e e r ” << e n d l ;
return ;
}
while ( f i c h e r o . r e a d ( ( char ∗ )&empl , s i z e o f ( Empleado ) ) && ! f i c h e r o . e o f ( ) ) {
i f ( empl . s a l a r i o > sueldoMinimo ) {
c o u t << e n d l ;
c o u t << ” Empleado : ” << e n d l ;
c o u t << empl ;
c o u t << e n d l ;
}
}
fichero . close () ;
}

2. [002.txt] Disponemos de los datos del campeonato de fórmula 1 en un fichero. pilotos.dat donde cada registro
consta de un código de 3 letras que indica el piloto y un entero que guarda su puntuación. Tenemos los datos de
la ultima carrera en fichero posiciones.dat, con el mı́smo código del piloto y la posicion obtenida en la ultima
carrera. Se pide que leamos posiciones.dat y actualicemos pilotos.dat, teniendo en cuenta que solamente
puntuan los 8 primeros pilotos, recibiendo 10,8,6,5,4,3,2 y 1 punto, respectivamente.

Solución:

#include <f s t r e a m >


#include <c s t d l i b >
#include <c s t r i n g >
#include <i o s t r e a m >

Página 3 de 23
Ficheros

using namespace s t d ;
void m e z c l a r f i c h e r o s ( void ) ;
const int TAM COD( 3 ) ;
const int TAM CIF( 1 2 ) ;
struct P i l o t o {
char c o d i g o [TAM COD ] ;
int puntos ;
};
struct P o s P i l o t o {
char c o d i g o [TAM COD ] ;
int orden ;
};
int main ( void ) {
mezclarficheros () ;
}
void m e z c l a r f i c h e r o s ( ) {
ifstream posiciones ;
fstream p i l o t o s ;
s tr eampos p o s a c t u a l ;
p o s i c i o n e s . open ( ” p o s i c i o n e s . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
if (! posiciones )
e x i t ( −1) ;
p i l o t o s . open ( ” p i l o t o s . dat ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
if (! pilotos )
e x i t ( −1) ;
P o s P i l o t o pos ;
Piloto p ;
p o s i c i o n e s . r e a d ( ( char ∗ ) &pos , s i z e o f ( P o s P i l o t o ) ) ;
while ( ! p o s i c i o n e s . e o f ( ) ) {
p i l o t o s . s e e k g ( 0 , i o s : : beg ) ;
pos actual = pilotos . t e l l g () ;
p i l o t o s . r e a d ( ( char ∗ ) &p , s i z e o f ( P i l o t o ) ) ;
while ( ! p i l o t o s . e o f ( ) ) {
i f ( ! strcmp ( p . c o d i g o , pos . c o d i g o ) ) {
i f ( pos . orden <= 8 ) {
switch ( pos . orden ) {
case 1 :
p . puntos +=10;
break ;
case 2 :
p . puntos +=8;
break ;
case 3 :
p . puntos +=6;
break ;
case 4 :
p . puntos +=5;
break ;
case 5 :
p . puntos +=4;
break ;
case 6 :
p . puntos +=3;
break ;
case 7 :
p . puntos +=2;
break ;

Página 4 de 23
Ficheros

case 8 :
p . puntos +=1;
break ;
}
p i l o t o s . s e e k g ( p o s a c t u a l , i o s : : beg ) ;
p i l o t o s . w r i t e ( ( char ∗ ) &p , s i z e o f ( P i l o t o ) ) ;
}
break ;
}
pos actual = pilotos . t e l l g () ;
p i l o t o s . r e a d ( ( char ∗ ) &p , s i z e o f ( P i l o t o ) ) ;
}
p o s i c i o n e s . r e a d ( ( char ∗ ) &pos , s i z e o f ( P o s P i l o t o ) ) ;
}
pilotos . close () ;
posiciones . close () ;
}

3. [003.txt] Se desea informatizar la gestión de las cartas que trata una oficina de correos. Concretamente de
cada carta es necesario tratar la siguiente información:

dirección (nombre, ciudad y código postal) del remitente y del destinatario,


si la carta esta o no certificada;
si la carta es o no urgente;
y el tamaño de la carta (puede ser pequeño, mediano, grande, extragrande).

Para ello se debe realizar los siguientes apartados:

Declara la estructura de datos necesaria para almacenar toda la información de una carta (se debe tener
como objetivo primordial el ahorro de espacio y la legibilidad de la estructura);
Suponer que se dispone de un fichero llamado “bandeja”, donde esta almacenada la información correspon-
diente a todas las cartas que dicha oficina de correos trata. Escribe un programa que lea de ese fichero y
almacene en otro, sólo el destinatario de todas aquellas cartas que sean urgentes y cuyo tamaño sea grande
o extragrande.

Solución:

#include <i o s t r e a m >


#include <f s t r e a m >
#include <c s t d l i b >
#include <c s t r i n g >
using namespace s t d ;

enum Dimension { pequeno , mediano , grande , e x t r a g r a n d e } ;


struct D i r e c c i o n {
char nombre [ 3 0 ] ;
char c i u d a d [ 2 0 ] ;
char c p o s t a l [ 6 ] ;
};
struct Carta {
Direccion remite ;
Direccion destino ;
bool c e r t i f i c a d a ;
bool u r g e n t e ;

Página 5 de 23
Ficheros

unsigned int d i m e n s i on : 2 ;
};
void m e z c l a r f i c h e r o s ( ) {
i f s t r e a m bandeja ;
ofstream s a l i d a ;
bandeja . open ( ” bandeja ” , i o s : : i n | i o s : : b i n a r y ) ;
i f ( ! bandeja ) return ;
s a l i d a . open ( ” s a l i d a ” , i o s : : out | i o s : : b i n a r y ) ;
i f ( ! s a l i d a ) return ;

Carta c a r t a ;
while ( ( bandeja . r e a d ( ( char ∗ ) &c a r t a , s i z e o f ( Carta ) ) && ! bandeja . e o f ( ) ) ) {
i f ( ( c a r t a . u r g e n t e ) && ( ( c a r t a . d i m e n s i on == grande ) | |
( c a r t a . d i m e n s i on == e x t r a g r a n d e ) ) ) {
s a l i d a . w r i t e ( ( char ∗ ) &c a r t a . d e s t i n o , s i z e o f ( D i r e c c i o n ) ) ;
}
}
bandeja . c l o s e ( ) ;
salida . close () ;
}

4. [004.txt] Se dispone de dos ficheros con las siguientes estructuras:


const int tam1 ( 3 0 ) ;
const int tam2 ( 1 2 ) ;
struct empleado
{
char nombre [ tam1 ] ;
unsigned int edad ;
};
struct empresa
{
char nombre [ tam1 ] ;
char CIF [ tam2 ] ;
};

La relación que existe entre ambos ficheros es la siguiente: la empresa en la que trabaja el empleado del primer
registro del fichero empleados se encuentra en el primer registro del fichero empresas, para el empleado del
segundo registro del fichero empleados se usara el segundo registro del fichero empresas, y ası́ sucesivamente.
Implementa una función que mezcle ambos ficheros de la siguiente forma: se debe crear otro fichero denominado
activos que contenga la información de cada empleado junto con la información de la empresa en que trabaja,
pero sólo de aquellos empleados cuya edad sea menor de 60 años.

Solución:

#include <f s t r e a m >


#include <c s t r i n g >
#include <i o s t r e a m >
using namespace s t d ;
int c r e a r f i c h e r o s ( void ) ;
void m e z c l a r f i c h e r o s ( void ) ;
void m o s t r a r a c t i v o s ( void ) ;
const int TAM NOMBRE( 3 0 ) ;
const int TAM CIF( 1 2 ) ;
struct empleado {
char nombre [TAM NOMBRE] ;

Página 6 de 23
Ficheros

unsigned int edad ;


};
struct empresa {
char nombre [TAM NOMBRE] ;
char c i f [ TAM CIF ] ;
};
struct a c t i v o {
struct empleado empleado ;
struct empresa empresa ;
};
void m e z c l a r f i c h e r o s ( ) {
i f s t r e a m empleados , empresas ;
ofstream activos ;
empleados . open ( ” empleados . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
i f ( ! empleados ) return ;
empresas . open ( ” empresas . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
i f ( ! empresas ) return ;
a c t i v o s . open ( ” a c t i v o s . dat ” , i o s : : out | i o s : : b i n a r y ) ;
i f ( ! a c t i v o s ) return ;
empleado empl ;
empresa empr ;
activo act ;
while ( ( empleados . r e a d ( ( char ∗ ) &empl , s i z e o f ( empleado ) ) && ! empleados . e o f ( ) )
){
empresas . r e a d ( ( char ∗ )&empr , s i z e o f ( empresa ) ) ;
i f ( empl . edad < 6 0 ) {
s t r c p y ( a c t . empleado . nombre , empl . nombre ) ;
a c t . empleado . edad = empl . edad ;
s t r c p y ( a c t . empresa . nombre , empr . nombre ) ;
s t r c p y ( a c t . empresa . c i f , empr . c i f ) ;
a c t i v o s . w r i t e ( ( char ∗ ) &act , s i z e o f ( a c t i v o ) ) ;
}
}
activos . close () ;
empleados . c l o s e ( ) ;
empresas . c l o s e ( ) ;
}

5. [005.txt] Supongamos que tenemos un fichero de nombre Çlasificacion”para almacenar los datos de las distintas
selecciones de fútbol que participan en el mundial (no están ordenados por ningún criterio). Para ello, la estructura
empleada es la siguiente:
const int TAM1 ( 6 ) ;
const int TAM2 ( 2 0 ) ;
struct Tequipo
{ char c o d i g o [ TAM1 ] ; // Formado por 4 d i g i t o s y un c a r a c t e r
char s e l e c c i o n [ TAM2 ] ; // Contiene e l nombre de l a s e l e c c i o n
unsigned int p a r t i d o s J u g a d o s : 5 ;
unsigned int : 0 ;
unsigned int p a r t i d o s G a n a d o s : 5 ;
unsigned int p a r t i d o s P e r d i d o s : 5 ;
unsigned int partidosEmpatados : 5 ;
};

Teniendo en cuenta dicho fichero, y sin usar ningún fichero auxiliar, hay que implementar:
una función que permita añadir al final del fichero una nueva selección (todavı́a no ha jugado ningún partido
del mundial). Esta función deberá leer del teclado el código (debe validarse) y el nombre de la selección, y

Página 7 de 23
Ficheros

almacenarlos en el fichero;
una función que actualice los datos almacenados en el fichero a partir de los resultados obtenidos en los partidos
jugados en una determinada jornada (se supone que una selección sólo puede jugar un partido en una jornada).
Estos resultados serán proporcionados a la función mediante un parámetro de tipo jornada, estructura descrita
a continuación:
struct j o r n a d a
{ unsigned int numero ; // I n d i c a e l numero de p a r t i d o s j u g a d o s .
partido ∗ vector ; // Puntero a un a r r a y dinamico cuyos e l e m e n t o s
// r e f l e j a n l o s d a t o s n e c e s a r i o s de cada p a r t i d o
};

Donde la estructura partido corresponde a:


struct p a r t i d o
{ char c o d i g o 1 [ TAM1 ] ; // Codigo d e l primer e q u i p o p a r t i c i p a n t e
char c o d i g o 2 [ TAM1 ] ; // Codigo d e l segundo e q u i p o p a r t i c i p a n t e
unsigned int g o l e s 1 : 4 ; // Numero de g o l e s marcados por e l primer e q u i p o
unsigned int g o l e s 2 : 4 ; // Numero de g o l e s marcados por e l segundo e q u i p o
};

Solución:

#include <i o s t r e a m >


#include <c s t r i n g >
#include <c s t d l i b >
#include <f s t r e a m >
using namespace s t d ;

const int TAM1 ( 6 ) ;


const int TAM2 ( 2 0 ) ;
struct Tequipo
{ char c o d i g o [ TAM1 ] ; // Formado por 4 d i g i t o s y un c a r a c t e r
char s e l e c c i o n [ TAM2 ] ; // Contiene e l nombre de l a s e l e c c i o n
unsigned int p a r t i d o s J u g a d o s : 5 ;
unsigned int : 0 ;
unsigned int p a r t i d o s G a n a d o s : 5 ;
unsigned int p a r t i d o s P e r d i d o s : 5 ;
unsigned int partidosEmpatados : 5 ;
};
struct p a r t i d o
{ char c o d i g o 1 [ TAM1 ] ; // Codigo d e l primer e q u i p o p a r t i c i p a n t e
char c o d i g o 2 [ TAM1 ] ; // Codigo d e l segundo e q u i p o p a r t i c i p a n t e
unsigned int g o l e s 1 : 4 ; // Numero de g o l e s marcados por e l primer e q u i p o
unsigned int g o l e s 2 : 4 ; // Numero de g o l e s marcados por e l segundo e q u i p o
};
struct j o r n a d a
{ unsigned int numero ; // I n d i c a e l numero de p a r t i d o s j u g a d o s .
partido ∗ vector ; // Puntero a un a r r a y dinamico cuyos e l e m e n t o s
// r e f l e j a n l o s d a t o s n e c e s a r i o s de cada p a r t i d o
};
bool c o d i g o C o r r e c t o ( char ∗ c o d i g o ) ;
int buscarEquipo ( j o r n a d a j , char ∗ c o d i g o ) ;
void l e e r E q u i p o ( ) {
Tequipo e q u i p o ;
o f s t r e a m c l a s i f i c a c i o n ( ” C l a s i f i c a c i o n ” , i o s : : app | i o s : : b i n a r y ) ;
char c o d i g o [TAM1 ] ;
do{

Página 8 de 23
Ficheros

c o u t << ” Codigo d e l e q u i p o : ” ;
c i n >> c o d i g o ;
} while ( ! c o d i g o C o r r e c t o ( c o d i g o ) ) ;
s t r n c p y ( e q u i p o . c o d i g o , c o d i g o , TAM1) ;
c o u t << ”Nombre d e l e q u i p o : ” ;
cin . ignore () ;
c i n . g e t l i n e ( e q u i p o . s e l e c c i o n , TAM2) ;
e q u i p o . p a r t i d o s J u g a d o s =0;
e q u i p o . partidosEmpatados =0;
e q u i p o . p a r t i d o s G a n a d o s =0;
e q u i p o . p a r t i d o s P e r d i d o s =0;
c l a s i f i c a c i o n . w r i t e ( ( char ∗ ) &equipo , s i z e o f ( Tequipo ) ) ;
c l a s i f i c a c i o n . close () ;
}
bool c o d i g o C o r r e c t o ( char ∗ c o d i g o ) {
f or ( int n= 0 ; n<3; n++){
i f ( ! i s d i g i t ( codigo [ n ] ) ) {
return f a l s e ;
}
}
i f ( ! isalpha ( codigo [ 4 ] ) ) {
return f a l s e ;
}
return true ;
}
void a c t u a l i z a r ( j o r n a d a j ) {
Tequipo e q u i p o ;
int numPartido = 0 ;
f s t r e a m c l a s i f i c a c i o n ( ” C l a s i f i c a c i o n ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
s tr eampos a c t u a l = c l a s i f i c a c i o n . t e l l g ( ) ;
c l a s i f i c a c i o n . r e a d ( ( char ∗ ) &equipo , s i z e o f ( Tequipo ) ) ;
while ( ! c l a s i f i c a c i o n . e o f ( ) ) {
numPartido = buscarEquipo ( j , e q u i p o . c o d i g o ) ;
i f ( numPartido >= 0 ) { // e q u i p o e n c o n t r a d o
e q u i p o . p a r t i d o s J u g a d o s ++;
int g o l e s 1 = j . v e c t o r [ numPartido ] . g o l e s 1 ;
int g o l e s 2 = j . v e c t o r [ numPartido ] . g o l e s 2 ;
i f ( ! strcmp ( e q u i p o . c o d i g o , j . v e c t o r [ numPartido ] . c o d i g o 1 ) ) {
if ( goles1 > goles2 ){
e q u i p o . p a r t i d o s G a n a d o s++;
} else i f ( goles2 > goles1 ) {
e q u i p o . p a r t i d o s P e r d i d o s ++;
} else {
e q u i p o . partidosEmpatados++;
}
} e l s e i f ( ! strcmp ( e q u i p o . c o d i g o , j . v e c t o r [ numPartido ] . c o d i g o 2 ) ) {
if ( goles1 < goles2 ){
e q u i p o . p a r t i d o s G a n a d o s++;
} else i f ( goles2 < goles1 ) {
e q u i p o . p a r t i d o s P e r d i d o s ++;
} else {
e q u i p o . partidosEmpatados++;
}
}
c l a s i f i c a c i o n . seekp ( actual ) ;
c l a s i f i c a c i o n . w r i t e ( ( char ∗ )&equipo , s i z e o f ( Tequipo ) ) ;
}

Página 9 de 23
Ficheros

actual = c l a s i f i c a c i o n . t e l l g () ;
c l a s i f i c a c i o n . r e a d ( ( char ∗ ) &equipo , s i z e o f ( Tequipo ) ) ;
}
}
int buscarEquipo ( j o r n a d a j , char ∗ c o d i g o ) {
f or ( int n=0; n< j . numero ; n++){
i f ( ! strcmp ( c o d i g o , j . v e c t o r [ n ] . c o d i g o 1 ) ) {
return n ;
}
i f ( ! strcmp ( c o d i g o , j . v e c t o r [ n ] . c o d i g o 2 ) ) {
return n ;
}
}
return −1;
}

6. [006.txt] Dada la definición de la clase Habitacion, completar la función actualizar, de forma que todas las
habitaciones almacenadas en el fichero binario ”clinica” cuyo número esté comprendido entre 100 y 120 (ambos
incluidos), queden vacı́as (el NIF del paciente será la cadena vacı́a).
const unsigned int TAMNIF ( 1 0 ) ;
class Habitacion {
unsigned int numero ;
char n i f [ TAMNIF ] ;
public :
H a b i t a c i o n ( unsigned int num = 0 , char n i f E n t r a d a [ ] = ” \0 ” ) {
numero = num ;
strcpy ( nif , nifEntrada ) ; }
void p u t N i f ( char nuevoNif [ ] ) { s t r c p y ( n i f , nuevoNif ) ; }
unsigned int getNumero ( ) { return numero ; }
char ∗ g e t N i f ( ) { return n i f ; }
}
void a c t u a l i z a r ( ) {
Habitacion h ;
fstream f l u j o ( ” c l i n i c a ” , ) ;
while ( ! f l u j o . e o f ( ) ) {
i f ( ( h . getNumero ( ) >= 100 ) && ( h . getNumero ( ) <= 120 ) ) {
h . putNIf ( ” \0 ” ) ;
}
}
flujo . close ( ) ;
}

Solución:

#include <i o s t r e a m >


#include <f s t r e a m >
#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
const unsigned int TAMNIF ( 1 0 ) ;
class Habitacion {
unsigned int numero ;
char n i f [ TAMNIF ] ;

Página 10 de 23
Ficheros

public :
H a b i t a c i o n ( unsigned int num = 0 , const char n i f E n t r a d a [ ] = ”” ) {
numero = num ;
strcpy ( nif , nifEntrada ) ; }
void putNIF ( const char nuevoNif [ ] ) { s t r c p y ( n i f , nuevoNif ) ; }
unsigned int getNumero ( ) { return numero ; }
char ∗ g e t N i f ( ) { return n i f ; }
};
void a c t u a l i z a r ( ) {
Habitacion h ;
f s t r e a m f l u j o ( ” c l i n i c a ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
while ( ( f l u j o . r e a d ( ( char ∗ )&h , s i z e o f ( H a b i t a c i o n ) ) ) && ( ! f l u j o . e o f ( ) ) ) {
i f ( ( h . getNumero ( ) >= 100 ) && ( h . getNumero ( ) <= 120 ) ) {
h . putNIF ( ”” ) ;
}
f l u j o . s e e k p ( s i z e o f ( H a b i t a c i o n ) ∗ −1, i o s : : c u r ) ;
f l u j o . w r i t e ( ( char ∗ )&h , s i z e o f ( H a b i t a c i o n ) ) ;
}
flujo . close ( ) ;
}

7. [007.txt] Se dispone de un fichero con acceso directo para almacenar la información correspondiente a las
personas nacidas en una provincia. Para ello se usa la siguiente estructura:
struct t i p o f e c h a
{ unsigned d i a ;
unsigned mes ;
unsigned anno ; } ;
struct ciudadano
{ char n i f [ 9 ] ; //N. I . F . d e l ciudadano
char nombre [ 4 0 ] ; // nombre c o m p l e t o d e l ciudadano
tipo fecha fecha nacimiento ; // f e c h a de n a c i m i e n t o d e l ciudadano
unsigned v i v o : 1 ; // s i s i g u e v i v o o no d i c h o ciudadano
unsigned t i e n e d e s c e n d i e n t e s : 1 ; // s i d i c h o ciudadano t i e n e d e s c e n d i e n t e s
};

Escribe un programa que lea de dicho fichero y almacene en otro, también de acceso directo, solo el nif y la fecha
de nacimiento de todas aquellas personas que sigan vivas y que hayan nacido entre 1930 y 1936.

Solución:

#include <f s t r e a m >


#include <i o s t r e a m >
#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
void f i l t r a r f i c h e r o ( void ) ;
const int TAM NOMBRE( 3 0 ) ;
const int TAM NIF( 1 2 ) ;
struct t i p o f e c h a {
unsigned d i a ;
unsigned mes ;
unsigned anno ;
};
struct ciudadano {
char n i f [ TAM NIF ] ;

Página 11 de 23
Ficheros

char nombre [TAM NOMBRE] ;


tipo fecha fecha nacimiento ;
unsigned v i v o : 1 ;
unsigned t i e n e d e s c e n d i e n t e s : 1 ;
};
int main ( void ) {
f i l t r a r f i c h e r o () ;
}
void f i l t r a r f i c h e r o ( ) {
i f s t r e a m ciudadanos ;
ofstream vivos ;
c i u d a d a n o s . open ( ” c i u d a d a n o s . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
i f ( ! ciudadanos ) {
c o u t << ”No puedo a b r i r e l f i c h e r o c i u d a d a n o s . dat ” ;
return ;
}
v i v o s . open ( ” v i v o s . dat ” , i o s : : out | i o s : : b i n a r y ) ;
i f ( ! vivos ) {
c o u t << ”No puedo a b r i r e l f i c h e r o v i v o d . dat ” ;
return ;
}

ciudadano p ;
while ( ( c i u d a d a n o s . r e a d ( ( char ∗ ) &p , s i z e o f ( ciudadano ) )
&& ! c i u d a d a n o s . e o f ( ) ) ) {
i f ( ( p . f e c h a n a c i m i e n t o . anno >= 1930
&& p . f e c h a n a c i m i e n t o . anno <= 1 9 3 6 )
&& ( p . v i v o == 1 ) ) {
v i v o s . w r i t e ( ( char ∗ ) &p . n i f , s i z e o f ( char ) ∗TAM NIF) ;
v i v o s . w r i t e ( ( char ∗ ) &p . f e c h a n a c i m i e n t o , s i z e o f ( t i p o f e c h a ) ) ;
}
}
vivos . close () ;
ciudadanos . c l o s e ( ) ;
}

8. [008.txt] Se desea informatizar la gestión de los pedidos de un centro comercial por parte del almacén del
mismo. Concretamente de cada pedido es necesario tratar la siguiente información:

identificador del pedido-tienda (esta compuesto por el identificador de la tienda que son tres caracteres y el
identificador propio del pedido que es un número entero)
dirección del cliente (nombre y apellidos, calle y número),
importe total del pedido,
número de bultos que comprende el pedido (no puede ser más de 7 bultos),
si el pedido esta o no pagado,
y el tratamiento que se le debe dar (puede ser muy frágil, frágil, normal y duro)

Para ello se debe realizar los siguientes apartados:

Declara la estructura de datos necesaria para almacenar toda la información de un pedido (se debe tener
como objetivo primordial el ahorro de espacio y la legibilidad de la estructura)
Suponer que se dispone de un fichero llamado almacen”, donde esta almacenada la información correspon-
diente a todos los pedidos que gestiona el almacén. Escribe un programa que lea de ese fichero e incremente
en un 10 % el importe total a todos aquellos pedidos que no hayan sido pagados y cuyo tratamiento sea
muy frágil o frágil.

Página 12 de 23
Ficheros

Solución:

#include <f s t r e a m >


#include <i o s t r e a m >
#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
void a c t u a l i z a r f i c h e r o ( ) ;
void c r e a r f i c h e r o ( ) ;
void m o s t r a r f i c h e r o ( ) ;
enum Tratamiento { m u y f r a g i l , f r a g i l , normal , duro } ;
struct IdPedido {
char i d T i e n d a [ 3 ] ;
int i d P e d i d o ;
};
struct D i r e c c i o n {
char nombre [ 3 0 ] ;
char a p e l l i d o s [ 4 0 ] ;
char c a l l e [ 4 0 ] ;
int numero ;
};
struct Pedido {
IdPedido i d ;
Direccion direccion ;
float importe ;
unsigned int numBultos : 3 ;
unsigned int pagado : 1 ;
Tratamiento t r a t a m i e n t o ;
};

void a c t u a l i z a r f i c h e r o ( ) {
f s t r e a m almacen ;
almacen . open ( ” almacen . dat ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
Pedido p e d i d o ;
s tr eampos a c t u a l ;
a c t u a l = almacen . t e l l g ( ) ;
almacen . r e a d ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;
while ( ! almacen . e o f ( ) ) {
i f ( ! ( p e d i d o . pagado ) && ( p e d i d o . t r a t a m i e n t o == f r a g i l | | p e d i d o .
t r a t a m i e n t o == m u y f r a g i l ) ) {
p e d i d o . i m p o r t e += p e d i d o . i m p o r t e ∗ 0 . 1 ;
almacen . s e e k p ( a c t u a l ) ;
almacen . w r i t e ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;
}

a c t u a l = almacen . t e l l g ( ) ;
almacen . r e a d ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;
}
almacen . c l o s e ( ) ;
}
void c r e a r f i c h e r o ( ) {
f s t r e a m almacen ;
almacen . open ( ” almacen . dat ” , i o s : : out | i o s : : b i n a r y ) ;
Pedido p e d i d o ;

s t r c p y ( p e d i d o . i d . idTienda , ”ABC” ) ;
pedido . id . idPedido = 1 ;

Página 13 de 23
Ficheros

s t r c p y ( p e d i d o . d i r e c c i o n . nombre , ” Juan ” ) ;
s t r c p y ( p e d i d o . d i r e c c i o n . a p e l l i d o s , ” Per ez ” ) ;
strcpy ( pedido . d i r e c c i o n . c a l l e , ” T e l l e i r a ” ) ;
p e d i d o . d i r e c c i o n . numero = 1 0 ;
pedido . importe = 123;
p e d i d o . numBultos = 3 ;
p e d i d o . pagado = 1 ;
pedido . tratamiento = f r a g i l ;

almacen . w r i t e ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;

s t r c p y ( p e d i d o . i d . idTienda , ”DEF” ) ;
pedido . id . idPedido = 1 ;
s t r c p y ( p e d i d o . d i r e c c i o n . nombre , ” L u i s ” ) ;
s t r c p y ( p e d i d o . d i r e c c i o n . a p e l l i d o s , ” Per ez ” ) ;
strcpy ( pedido . d i r e c c i o n . c a l l e , ” T e l l e i r a ” ) ;
p e d i d o . d i r e c c i o n . numero = 2 0 ;
pedido . importe = 123;
p e d i d o . numBultos = 3 ;
p e d i d o . pagado = 0 ;
pedido . tratamiento = f r a g i l ;

almacen . w r i t e ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;

s t r c p y ( p e d i d o . i d . idTienda , ”GHI” ) ;
pedido . id . idPedido = 1 ;
s t r c p y ( p e d i d o . d i r e c c i o n . nombre , ”Manuel ” ) ;
s t r c p y ( p e d i d o . d i r e c c i o n . a p e l l i d o s , ” Per ez ” ) ;
strcpy ( pedido . d i r e c c i o n . c a l l e , ” T e l l e i r a ” ) ;
p e d i d o . d i r e c c i o n . numero = 3 0 ;
pedido . importe = 123;
p e d i d o . numBultos = 2 ;
p e d i d o . pagado = 0 ;
pedido . tratamiento = m u y f r a g i l ;

almacen . w r i t e ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;

almacen . c l o s e ( ) ;
}
void m o s t r a r f i c h e r o ( ) {
f s t r e a m almacen ;
almacen . open ( ” almacen . dat ” , i o s : : i n | i o s : : b i n a r y ) ;
Pedido p e d i d o ;
s tr eampos a c t u a l ;
almacen . r e a d ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;
while ( ! almacen . e o f ( ) ) {
c o u t << ”−−−−−−−−pedido−−−−−−−−−−−−−−” << e n d l ;
c o u t << ” i d P e d i d o : ” << p e d i d o . i d . i d P e d i d o << e n d l ;
c o u t << ”nombre : ” << p e d i d o . d i r e c c i o n . nombre << e n d l ;
c o u t << ” a p e l l i d o s : ” << p e d i d o . d i r e c c i o n . a p e l l i d o s << e n d l ;
c o u t << ” c a l l e : ” << p e d i d o . d i r e c c i o n . c a l l e << e n d l ;
c o u t << ”numero : ”<< p e d i d o . d i r e c c i o n . numero << e n d l ;
c o u t << ” i m p o r t e : ” << p e d i d o . i m p o r t e << e n d l ;
c o u t << ” b u l t o s : ” << p e d i d o . numBultos << e n d l ;
c o u t << ” pagado : ” ;
switch ( p e d i d o . pagado ) {
case 1 : c o u t << ” s i ” ; break ;

Página 14 de 23
Ficheros

case 0 : c o u t << ”no” ; break ;


}
c o u t << e n d l ;

c o u t << ” t r a t a m i e n t o : ” ;
switch ( p e d i d o . t r a t a m i e n t o ) {
case m u y f r a g i l : c o u t << ”muy f r a g i l ” ; break ;
case f r a g i l : c o u t << ” f r a g i l ” ; break ;
case normal : c o u t << ” normal ” ; break ;
case duro : c o u t << ” duro ” ; break ;
}
c o u t << e n d l ;

almacen . r e a d ( ( char ∗ )&pedido , s i z e o f ( Pedido ) ) ;


}
almacen . c l o s e ( ) ;

}
int main ( ) {
crearfichero () ;
mostrarfichero () ;
actualizarfichero () ;
mostrarfichero () ;
}

9. [009.txt] Supongamos una empresa que lleva el registro de citas solicitadas (concedidas o no) de cada mes de
sus empleados en un fichero denominado Citas.txt. La estructura de cada cita está formada por el nombre del
empleado, un dı́a del mes, una hora, el motivo de la cita (una única palabra) y si dicho permiso ha sido o no
concedido. Por ejemplo:
Empleado Dı́a Hora Motivo Permiso
Pepe 23 17 dentista true
Luisa 15 10 conferencia false
Julio 23 17 comida false
Por lo tanto, el fichero responde a la siguiente estructura:
const int tam ( 3 0 ) ;
struct T c i t a {
unsigned int d i a ;
unsigned int hora ;
};
struct T c i t a e m p l e a d o {
char empleado [ tam ] ;
Tcita c i t a ;
char motivo [ tam ] ;
bool p e r m i s o ;
};

Escribir una función que dé permiso a todas aquellas citas del citado fichero cuyo dı́a y hora correspondan con
los datos recibidos por la función, y que no hayan sido ya concedidas. Teniendo en cuenta el ejemplo anterior, si
la función recibe como dı́a 23 y como hora 17, la función actualizará el fichero quedando de la siguiente forma:
Empleado Dı́a Hora Motivo Permiso
Pepe 23 17 dentista true
Luisa 15 10 conferencia false
Julio 23 17 comida frue

Página 15 de 23
Ficheros

Solución:

#include <f s t r e a m >


#include <i o s t r e a m >
#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
void m o s t r a r f i c h e r o ( ) ;
void a c t u a l i z a r c i t a s ( unsigned int dia , unsigned int hora ) ;

const int tam ( 3 0 ) ;


struct T c i t a {
unsigned int d i a ;
unsigned int hora ;
};
struct T c i t a e m p l e a d o {
char empleado [ tam ] ;
Tcita c i t a ;
char motivo [ tam ] ;
bool p e r m i s o ;
};

// A c t u a l i z a r en f i c h e r o l a s de un d i a y una hora que no t e n g a n permiso


void a c t u a l i z a r c i t a s ( unsigned int dia , unsigned int hora ) {
s tr eampos p o s i c i o n ;
Tcita empleado c i t a ;
fstream f i c h e r o ;
f i c h e r o . open ( ” c i t a s . t x t ” , i o s : : i n | i o s : : out ) ;
if (! fichero ){
c o u t << ” El f i c h e r o no puede a b r i r s e para a c t u a l i z a r ” << e n d l ;
return ;
}
p o s i c i o n = f i c h e r o . t e l l g ( ) ; // guardo pos para v o l v e r a t r a s y e s c r i b i r en
ella
f i c h e r o . r e a d ( ( char ∗ )&c i t a , s i z e o f ( c i t a ) ) ;
while ( ! f i c h e r o . e o f ( ) ) {
i f ( c i t a . c i t a . d i a == d i a && c i t a . c i t a . hora == hora && c i t a . p e r m i s o == f a l s e
){
c i t a . p e r m i s o = true ;
f i c h e r o . s e e k p ( p o s i c i o n ) ; // v u e l v o a t r a s para e s c r i b i r
f i c h e r o . w r i t e ( ( char ∗ ) &c i t a , s i z e o f ( c i t a ) ) ;
}
p o s i c i o n = f i c h e r o . t e l l g ( ) ; // guardo pos para v o l v e r a t r a s y e s c r i b i r en
ella
f i c h e r o . r e a d ( ( char ∗ )&c i t a , s i z e o f ( c i t a ) ) ;
}
fichero . close () ;
}
void m o s t r a r f i c h e r o ( void ) {
Tcita empleado c i t a ;
fstream f i c h e r o ;
f i c h e r o . open ( ” c i t a s . t x t ” , i o s : : i n ) ;
if (! fichero ){
c o u t << ” El f i c h e r o no puede a b r i r s e para l e e r ” << e n d l ;
return ;
}
while ( f i c h e r o . r e a d ( ( char ∗ )&c i t a , s i z e o f ( c i t a ) ) && ! f i c h e r o . e o f ( ) ) {

Página 16 de 23
Ficheros

cout << endl ;


cout << ” Empleado : ” << c i t a . empleado << e n d l ;
cout << ” Dia : ” << c i t a . c i t a . d i a << e n d l ;
cout << ” Hora : ” << c i t a . c i t a . hora<< e n d l ;
cout << ” Motivo : ” << c i t a . motivo << e n d l ;
cout << ” Permiso : ” << ( char ∗ ) ( c i t a . p e r m i s o ? ” v e r d a d e r o ” : ” f a l s o ” ) << e n d l ;
cout << endl ;
}
fichero . close () ;
}
int main ( void ) {
mostrarfichero () ;
actualizarcitas (4 ,3) ;
mostrarfichero () ;
}

10. [010.txt] Dada la definición de la clase Habitacion, completar la función actualizar, de forma que todas las
habitaciones almacenadas en el fichero binario çlinicaçuyo número esté comprendido entre 100 y 120 (ambos
incluidos), queden vacı́as (el NIF del paciente será la cadena vacı́a).

Solución:

#include <i o s t r e a m >


#include <f s t r e a m >
#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
const unsigned int TAMNIF ( 1 0 ) ;
class Habitacion {
unsigned int numero ;
char n i f [ TAMNIF ] ;
public :
H a b i t a c i o n ( unsigned int num = 0 , const char n i f E n t r a d a [ ] = ”” ) {
numero = num ;
strcpy ( nif , nifEntrada ) ; }
void p u t N i f ( const char nuevoNif [ ] ) { s t r c p y ( n i f , nuevoNif ) ; }
unsigned int getNumero ( ) { return numero ; }
char ∗ g e t N i f ( ) { return n i f ; }
};
void a c t u a l i z a r ( ) {
Habitacion h ;
f s t r e a m f l u j o ( ” c l i n i c a ” , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
while ( ! f l u j o . e o f ( ) ) {
i f ( ( h . getNumero ( ) >= 100 ) && ( h . getNumero ( ) <= 120 ) ) {
h . p u t N i f ( ”” ) ;
}
}
flujo . close ( ) ;
}
int main ( ) {
actualizar () ;
}

11. [012.txt] La clase TablaVehiculos permite mantener un fichero sencillo vehı́culos. Conviértela en generica

Página 17 de 23
Ficheros

para que guarde registros de cualquier clase. Demuestra que funciona creando una clase Persona y guardando
unos cuantos objetos en un fichero personas.dat
class TablaVehiculos {
public :
T a b l a V e h i c u l o s ( char ∗ f i l e N a m e ) ;
˜ TablaVehiculos () ;
void g o S t a r t ( ) ;
bool a t S t a r t ( ) ;
void goEnd ( ) ;
bool atEnd ( ) ;
void goNext ( ) ;
void goPrev ( ) ;
void goRec ( int pos ) ;
int getNumRec ( ) ;
int g e t S i z e ( ) ;
bool g e t ( V e h i c u l o & r ) ;
void s e t ( V e h i c u l o & r ) ;
private :
fstream f l u j o ;
Vehiculo ∗ r ;
int a c t u a l P o s ;
int l a s t P o s ;
};
#define ID SIZE 5
#define NOMBRE SIZE 10
#define APELLIDOS SIZE 20
#define ESTATURA SIZE 5

c l a s s Persona {
public :
int i d ;
char nombre [ NOMBRE SIZE ] ;
char a p e l l i d o s [ APELLIDOS SIZE ] ;
float estatura ;
friend ostream & operator << ( ostream & out , Persona & r ) ;
friend i s t r e a m & operator >> ( i s t r e a m & in , Persona & r ) ;
};

Solución:

#include <s t r i n g >


#include <i o s t r e a m >
#include <f s t r e a m >
#include <c s t d l i b >
#include <iomanip>
using namespace s t d ;

#define SEP ’ | ’
#define ID SIZE 5
#define NOMBRE SIZE 10
#define APELLIDOS SIZE 20
#define ESTATURA SIZE 5

s t r i n g h e a d e r ( ”+”+
s t r i n g ( ID SIZE , ’− ’ ) + SEP+
s t r i n g (NOMBRE SIZE, ’− ’ ) + SEP+
s t r i n g ( APELLIDOS SIZE , ’− ’ )+ SEP+

Página 18 de 23
Ficheros

s t r i n g (ESTATURA SIZE , ’− ’ ) + ”+” ) ;

c l a s s Persona {
public :
int i d ;
char nombre [ NOMBRE SIZE ] ;
char a p e l l i d o s [ APELLIDOS SIZE ] ;
float estatura ;
friend ostream & operator << ( ostream & out , Persona & r ) ;
friend i s t r e a m & operator >> ( i s t r e a m & in , Persona & r ) ;
};

ostream & operator << ( ostream & out , Persona & r ) {


out << h e a d e r << e n d l
<< SEP << s t d : : r i g h t << setw ( ID SIZE ) << r . i d
<< SEP << s t d : : l e f t << setw (NOMBRE SIZE) << r . nombre
<< SEP << s t d : : l e f t << setw ( APELLIDOS SIZE ) << r . a p e l l i d o s
<< SEP << s t d : : r i g h t << setw (ESTATURA SIZE) << r . e s t a t u r a
<< SEP
<< e n d l ;
return out ;
}
i s t r e a m & operator >> ( i s t r e a m & in , Persona & r ) {
i n >> r . i d
>> r . nombre
>> r . a p e l l i d o s
>> r . e s t a t u r a ;
return i n ;
}

template <typename T>


c l a s s Tabla {
public :
Tabla ( const char ∗ f i l e N a m e ) ;
˜ Tabla ( ) ;
void g o S t a r t ( ) ;
bool a t S t a r t ( ) ;
void goEnd ( ) ;
bool atEnd ( ) ;
void goNext ( ) ;
void goPrev ( ) ;
void goRec ( int pos ) ;
int getNumRec ( ) ;
int g e t S i z e ( ) ;
bool g e t (T & r ) ;
void s e t (T & r ) ;
private :
fstream f l u j o ;
T ∗ r;
int a c t u a l P o s ;
int l a s t P o s ;
};
template <typename T>
Tabla<T> : : Tabla ( const char ∗ f i l e N a m e ) {
f l u j o . open ( fileName , i o s : : i n | i o s : : out | i o s : : b i n a r y ) ;
if (! flujo ){
f l u j o . open ( fileName , i o s : : i n | i o s : : out | i o s : : t r u n c | i o s : : b i n a r y ) ;

Página 19 de 23
Ficheros

}
if (! flujo ){
c o u t << ” I m p o s i b l e a b r i r e l f i c h e r o ! ”<<e n d l ;
e x i t ( −1) ;
}
goEnd ( ) ;
goStart () ;
}
template <typename T>
Tabla<T> : : ˜ Tabla ( ) {
flujo . close () ;
}
template <typename T>
void Tabla<T> : : g o S t a r t ( ) {
f l u j o . seekp (0) ;
flujo . clear () ;
actualPos = 0;
}
template <typename T>
bool Tabla<T> : : a t S t a r t ( ) {
return a c t u a l P o s == 0 ;
}
template <typename T>
bool Tabla<T> : : atEnd ( ) {
return a c t u a l P o s == l a s t P o s ;
}
template <typename T>
void Tabla<T> : : goNext ( ) {
i f ( atEnd ( ) ) return ;
a c t u a l P o s ++;
f l u j o . s e e k p ( ( s i z e o f (T) ) , i o s : : c u r ) ;
}
template <typename T>
void Tabla<T> : : goPrev ( ) {
i f ( a t S t a r t ( ) ) return ;
a c t u a l P o s −−;
f l u j o . s e e k p ( ( s i z e o f (T) ) ∗ −1, i o s : : c u r ) ;
}
template <typename T>
void Tabla<T> : : goEnd ( ) {
f l u j o . s e e k p ( 0 , i o s : : end ) ;
a c t u a l P o s = f l u j o . t e l l p ( ) / s i z e o f (T) ;
lastPos = actualPos ;
}
template <typename T>
void Tabla<T> : : goRec ( int pos ) {
i f ( pos <0) return ;
f l u j o . s e e k p ( pos ∗ ( s i z e o f (T) ) ) ;
a c t u a l P o s = f l u j o . t e l l p ( ) / s i z e o f (T) ;
}
template <typename T>
int Tabla<T> : : getNumRec ( ) {
return a c t u a l P o s ;
}
template <typename T>
int Tabla<T> : : g e t S i z e ( ) {
return l a s t P o s ;

Página 20 de 23
Ficheros

}
template <typename T>
bool Tabla<T> : : g e t (T & r ) {
i f ( atEnd ( ) ) return f a l s e ;
f l u j o . r e a d ( ( char ∗ )&r , s i z e o f (T) ) ;
a c t u a l P o s ++;
return true ;
}
template <typename T>
void Tabla<T> : : s e t (T & r ) {
f l u j o . w r i t e ( ( char ∗ )&r , s i z e o f (T) ) ;
i f ( a c t u a l P o s == l a s t P o s ) l a s t P o s ++;
a c t u a l P o s ++;
}
int main ( ) {
Tabla<Persona> t ( ” c o s a s . dat ” ) ;
Persona r ;
t . goEnd ( ) ;
while ( true ) {
c o u t << ” T e c l e a l o s d a t o s ( i d=0 para t e r m i n a r ) : ”<<e n d l ;
c i n >> r ;
i f ( r . i d == 0 ) {
break ;
}
t . set ( r ) ;
}
t . goStart () ;
while ( ! t . atEnd ( ) ) {
t . get ( r ) ;
c o u t << r ;
}
c o u t << h e a d e r << e n d l ;
}

12. [013.txt] Dadas las siguientes estructuras y declaraciones:


# include <i o s t r e a m >
using namespace s t d ;
const unsigned int MAXFAMILIAS ( 10 ) ;
const unsigned int MAXNOMBRE ( 30 ) ;
const unsigned int MAXDIRECCION ( 50 ) ;
struct g a s t o {
float gastosTransporte ;
float gastosVivienda ;
float gastosAlimentacion ;
};
struct f a m i l i a {
char nombre [ MAXNOMBRE ] ;
enum T D o m i c i l i o { c a l l e , p l a z a , a v e n i d a } t i p o D o m i c i l i o ;
char d i r e c c i o n [ MAXDIRECCION ] ;
unsigned int numeroMiembros ;
gasto gastosFamilia ;
};
struct s e t F a m i l i a s {
f a m i l i a f a m i l i a s [ MAXFAMILIAS } ;
int numFamilias ; // Numero t o t a l de f a m i l i a s e x i s t e n t e s en e l v e c t o r f a m i l i a s
};

Página 21 de 23
Ficheros

Implementar una función que devuelva los datos de una familia completa, leı́dos por teclado dentro de la propia
función.

Solución:

# include <i o s t r e a m >


#include <c s t r i n g >
#include <c s t d l i b >
using namespace s t d ;
const unsigned int MAXFAMILIAS ( 10 ) ;
const unsigned int MAXNOMBRE ( 30 ) ;
const unsigned int MAXDIRECCION ( 50 ) ;
struct g a s t o {
float gastosTransporte ;
float gastosVivienda ;
float gastosAlimentacion ;
};
struct f a m i l i a {
char nombre [ MAXNOMBRE ] ;
enum T D o m i c i l i o { c a l l e , p l a z a , a v e n i d a } t i p o D o m i c i l i o ;
char d i r e c c i o n [ MAXDIRECCION ] ;
unsigned int numeroMiembros ;
gasto gastosFamilia ;
};
struct s e t F a m i l i a s {
f a m i l i a f a m i l i a s [ MAXFAMILIAS ] ;
int numFamilias ; // Numero t o t a l de f a m i l i a s e x i s t e n t e s en e l v e c t o r
familias
};
familia leeFamilia () {
familia ret ;
int t i p o D i r ;
c o u t << ”Nombre : ” ;
c i n . g e t l i n e ( r e t . nombre , MAXNOMBRE) ;
c o u t << ” Tipo d i r e c c i o n ( 0 : c a l l e , 1 : p l a z a , 2 : avda ) : ” ;
c i n >> t i p o D i r ;
switch ( t i p o D i r ) {
case f a m i l i a : : c a l l e :
ret . tipoDomicilio = familia : : calle ;
break ;
case f a m i l i a : : p l a z a :
ret . tipoDomicilio = familia : : plaza ;
break ;
case f a m i l i a : : a v e n i d a :
r e t . t i p o D o m i c i l i o = f a m i l i a : : avenida ;
break ;
}
cin . ignore () ;
c o u t << ” D i r e c c i o n : ” ; c i n . g e t l i n e ( r e t . d i r e c c i o n , MAXDIRECCION) ;
c o u t << ”Numero de miembros : ” ; c i n >> r e t . numeroMiembros ;
c o u t << ” Gastos t r a n s p o r t e : ” ; c i n >> r e t . g a s t o s F a m i l i a . g a s t o s T r a n s p o r t e ;
c o u t << ” Gastos v i v i e n d a : ” ; c i n >> r e t . g a s t o s F a m i l i a . g a s t o s V i v i e n d a ;
c o u t << ” Gastos a l i m e n t a c i o n : ” ; c i n >> r e t . g a s t o s F a m i l i a . g a s t o s A l i m e n t a c i o n
;
cin . ignore () ;
return r e t ;
}

Página 22 de 23
Ficheros

13. [014.txt] Escribe un manipulador propio de entrada para cambiar la base a hexadecimal y otro de salida para
cambiar la precisión a 10 dı́gitos y la longitud de campo a 30 caracteres. Escribir un programa de prueba.

Solución:

#include <i o s t r e a m >


#include <iomanip>
using namespace s t d ;
c l a s s MuyAncho{
};
c l a s s AHex{
};
ostream & operator << ( ostream & os , MuyAncho &t ) {
o s << s e t p r e c i s i o n ( 1 0 ) ;
o s << setw ( 3 0 ) ;
return o s ;
}
i s t r e a m & operator >> ( i s t r e a m & i s , AHex &t ) {
i s >> hex ;
return i s ;
}
int main ( ) {
AHex xx ;
MuyAncho mm;
f l o a t n=0;
c i n >> xx >> n ;
c o u t << ” [ ” << mm << n << ” ] ” ;
}

Página 23 de 23

También podría gustarte