Ficherosc
Ficherosc
Ficherosc
Informática Gestión
En dichos casos se utilizarán ficheros para contener la información en memoria secundaria (disco duro, disquetes, etc.).
Definición de Fichero:
Es una colección de elementos lógicamente relacionados y almacenados en memoria secundaria. A más bajo nivel, un
fichero es una secuencia de bits almacenado en algún dispositivo externo (como por ejemplo uno de memoria secundaria).
En C++ un fichero es simplemente un flujo externo que se puede abrir para entrada (dando lugar a un flujo de archivo de
entrada que, para simplificar, llamaremos simplemente archivo o fichero de entrada), para salida (dando lugar a un flujo de
archivo de salida que, para simplificar, llamaremos simplemente archivo o fichero de salida) o para entrada-salida (archivo
o fichero de entrada-salida o archivo de E/S).
C++ soporta dos tipos de archivos: de texto y binarios. Los primeros almacenan datos como códigos ASCII. Los valores
simples, tales como números y caracteres están separados por espacios o retornos de carro. Los segundos almacenan bits de
forma directa (por lo que no se necesitan separadores) y se necesita usar la dirección de una posición de almacenamiento.
Una biblioteca en C++ que proporciona “funciones” y operadores para el manejo de ficheros es la biblioteca fstream.
#include <fstream>
Ejemplo 1:
Las dos líneas siguientes abren el fichero “mio.txt” como fichero de entrada (para lectura) y lo asocian al
descriptor in.
ifstream in; // descriptor del fichero a abrir
in.open(“mio.txt”); // Apertura del fichero;
Ejemplo 2:
Para abrir el fichero “salida.dat” en modo salida (si el fichero no existe lo crea, y si existe borra su contenido)
asociándolo al descriptor out podemos usar la siguiente sentencia;
ofstream out;
out.open("salida.dat");
Ejemplo 3:
Cierre de ficheros.
Un fichero anteriormente abierto y con un descriptor asociado a él debe ser cerrado con el fin de liberar los recursos
asociado a él de la siguiente forma:
descriptor.close()
Ø La función eof() que devuelve true si se ha alcanzado el final del fichero y falso en cualquier otro caso.
REQUIERE LECTURA ADELANTADA: Para que la función eof() devuelva un valor de verdad
(actualizado).
Ø La funcioón fail() devuelve true si existe un error en una operación de flujo asociada al fichero
Ø La función bad() devuelve true si el flujo está corrupto.
Ø La función good() que devuelve true si no existe un error en una operación de flujo y false en caso
contrario.
Antes de empezar a leer o escribir en un fichero es siempre conveniente verificar que la operación de apertura se realizó con
éxito.
Ejemplo 4:
ifstream in;
in.open("F1.dat");
if (in.bad() )
{
cout << "\n Incapaz de crear o abrir el fichero "; // salida estándar
cout << " para salida " << endl;
}
else
{
// Se opera sobre el fichero
}
Ficheros de texto
La lectura y la escritura en un archivo de texto se puede realizar directamente con los operadores << y >> al igual que se
realiza sobre los flujos estándares cin y cout.
Ejemplo 5:
El siguiente programa escribe tres líneas en un fichero llamado “EJEMPLO5.TXT” que se crea en el programa
(si ya existe borramos su contenido). Cada línea consta de un entero, un real y una cadena de caracteres. Los
datos en cada línea están separados por espacios en blanco.
int main()
{
ofstream fichout;
fichout.open("EJEMPLO5.TXT");
if (fichou.bad()t)
{
cout << "\n Incapaz de crear este o abrir el fichero \n";
}
else
{ // Escritura en el fichero
fichout << "Alumno 1" << " " << 5.0 << " APROBADO" << endl;
fichout << "Alumno 2" << " " << 1.1 << " SUSPENSO" << endl;
fichout << "Alumno 3" << " " << 8.0 << " NOTABLE " << endl;
fichout.close();
}
} // Fin del main
Comentario:
El operador >> omite los espacios en blanco al igual que ocurría en la entrada estándar.
Ejemplo 6:
El siguiente programa lee el fichero de texto “EJEMPLO5.TXT”, creado en el ejemplo anterior, y visualiza su
contenido en el monitor.
int main()
{
ifstream fichin; // declaracion del fichero
int i;
float r;
TCadena cad;
fichin.open("EJEMPLO5.TXT");
if (fichin.bad())
{ cout << "Incapaz de crear o abrir el fichero " << endl;
}
else
{ fichin >> i; // Observese la lectura adelantada!!!
while (!fichin.eof())
{ cout << i << " "; // Lectura de valores en el fichero
fichin >> r;
cout << r << " "; // Lectura de valores en el fichero
fichin >> cad;
cout << cad << endl; // Lectura de valores en el fichero
Comentarios:
(1) Observe en el ejemplo anterior que ha sido necesario realizar una lectura adelantada previamente al chequeo del fin de
fichero. Si no se realiza de esta forma podríamos tener problemas.
(2) Observe también que no es necesario realizar una lectura para “saltarse” los espacios en blanco que fueron introducidos
en el fichero “EJEMPLO5.TXT” en el ejemplo 5. Esto es debido a que, como ya se comentó anteriormente, el operador >>
omite los espacios en blanco
(3) No olvide cerrar los ficheros!!
Ficheros Binarios
Los ficheros binarios tiene la información tal cual está en memoria, es decir, sin convertirla a texto, La manera de leer y
escribir en ficheros binarios consiste en utilizar las funciones read() y write().
descriptor.read(&c, num);
Descriptor.write(&c, num);
donde c es una variable de cualquier tipo PERO PASADA COMO (char *) por referencia, y num es un entero o una
variable de tipo entero, ejecuta una lectura/escritura (a partir de la posición actual del cursor del fichero asociado a la
variable descriptor) de num bytes del fichero. Normalmente, para expresar el tamaño o número de bytes a leer/escribir se
usa la función sizeof que nos retorna el número de bytes que ocupa una variable o tipo. Por ejemplo, para leer/ escribir
un número entero en binario, usaremos:
int x;
...
descriptor.read ((char *)(&x),sizeof(int));
descriptor.write((char *)(&x),sizeof(int));
//TIPOS
typedef char TCadena[MAXCAD+1]; // MAXCAD caracteres + FINCAD
struct TPersona
{
TCadena nombre;
TCadena apellido1;
TCadena apellido2;
int telefono;
};
// PROGRAMA PRINCIPAL
int main()
{
TPersona p;;
char opcion;
int num;
bool fin,encontrado;
TCadena nomFich;
fin = false;
do
{
borrar_pantalla();
opcion = menu();
switch(opcion)
{
case 'A': cout << "Nombre del Fichero: ";
cin >> nomFich;
LeerPersona(p);
insertarPersonaTXT(nomFich,p);
break;
case 'B': cout << "Nombre del Fichero: ";
cin >> nomFich;
LeerPersona(p);
insertarPersonaBIN(nomFich,p);
break;
case 'C': cout << "Nombre del Fichero: ";
cin >> nomFich;
listarAgendaTXT(nomFich);
break;
case 'D': cout << "Nombre del Fichero: ";
cin >> nomFich;
listarAgendaBIN(nomFich);
break;
case 'X': fin = confirmar_salida();
break;
}
if (!fin)
{
pausa();
}
} while (!fin);
pausa();
return 0;
}
void pausa()
{
system("PAUSE");
void borrar_pantalla()
{
system("CLS");
}
char menu()
{
char op;
void EscribirPersona(TPersona p)
{
cout << "Nombre : " << p.nombre << endl;
cout << "Apellidos : " << p.apellido1
<< " " << p.apellido2 << endl;
cout << "Teléfono : " << p.telefono << endl;
}
bool confirmar_salida()
{
char car;
return (car=='S');
}
out.open(nombreFichero,ios::app);
// Abro el fichero para añadir
if (out.bad())
{ // El fichero no existe ... lo creo
out.open(nombreFichero);
}
EscribePersonaFicheroTXT(out,p);
out.close();
}
in.open(nombreFichero);
if (in.bad())
{
cout << "Error al abrir el fichero: "
<< nombreFichero << endl;
}
else
{
LeePersonaFicheroTXT(in,persona);
while (!in.eof())
{
EscribirPersona(persona);
LeePersonaFicheroTXT(in,persona);
pausa();
}
in.close();
}
}
if (out.bad())
{ // El fichero no existe ... lo creo
out.open(nombreFichero);
}
EscribePersonaFicheroBIN(out,p);
out.close();
}
in.open(nombreFichero, ios::binary);
if (in.bad())
{
cout << "Error al abrir el fichero: " << nombreFichero << endl;
}
else
{
LeePersonaFicheroBIN(in,persona);
while (!in.eof())
{
EscribirPersona(persona);
LeePersonaFicheroBIN(in,persona);
pausa();
}
in.close();
}
}
Ejemplo:
2. Escribir un programa que lea el contenido de un fichero de texto facilitado por el usuario y genere un nuevo fichero de
texto llamado "INVERSO.TXT" que tenga las misma líneas que el fichero original pero en orden inverso.
ENTRADA.TXT INVERSO.TXT
Línea 1 Línea 5
Línea 2 Línea 4
Línea 3 Línea 3
Línea 4 Línea 2
Línea 5 Línea 1