#include <iostream>
#include <fstream>
using namespace std;
void comprobar_fichero()
{char mes1[20];
ofstream fich1("meses.dat", ios::out | ios::binary);
ifstream fich("meses.dat", ios::in | ios::binary);
fich.clear();
fich.read(mes1, 20);
cout << mes1 << endl;
cout << "Paso la lectura" << endl;
if (fich.good())
cout << mes1 << endl;
else {
cout << "Error al leer de Fichero" << endl;
if (fich.fail()) cout << "Bit fail activo" << endl;
if (fich.eof()) cout << "Bit eof activo" << endl;
if (fich.bad()) cout << "Bit bad activo" << endl;
}
fich.close();
fich1.close();
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
char mes[][20] = { "Enero", "Febrero", "Marzo",
"Abril", "Mayo", "Junio", "Julio", "Agosto",
"Septiembre", "Octubre", "Noviembre",
"Diciembre" };
char cad[20];
ofstream fsalida("meses.dat",ios::out | ios::binary);
// Crear fichero con los nombres de los meses:
cout << "Crear archivo de nombres de meses:" << endl;
for (i = 0; i < 12; i++)
fsalida.write(mes[i], 20);
fsalida.close();
ifstream fentrada("meses.dat", ios::in | ios::binary);
streampos pos = fentrada.tellg();
// Acceso secuencial:
cout << "\nAcceso secuencial:" << endl;
fentrada.read(cad, 20);
do {
cout << cad << endl;
fentrada.read(cad, 20);} while (!fentrada.eof());
fentrada.clear();
// Acceso aleatorio:
cout << "\nAcceso aleatorio:" << endl;
for (i = 11; i >= 0; i--) {
fentrada.seekg(20 * i, ios::beg);
fentrada.read(cad, 20);
cout << cad << endl;
}
// Calcular el número de elementos
// almacenados en un fichero:
// ir al final del fichero
fentrada.seekg(0, ios::end);
// leer la posición actual
pos = fentrada.tellg();
// El número de registros es el tamaño en
// bytes dividido entre el tamaño del registro:
cout << "\nNumero de registros: " << pos / 20 << endl;
fentrada.close();system("pause");
// comprobación de datos del registro:
comprobar_fichero();
system("pause");
return EXIT_SUCCESS;
}
Archivos en C++
Aprende a manejar archivos en C++
miércoles, 17 de diciembre de 2014
martes, 16 de diciembre de 2014
CONTENIDO 1
CONTENIDO
1. Introducción.
2. Manipulación de ficheros.
3. Organización de archivos.
4. Tipo de almacenamiento.
5. Biblioteca de flujos.
6. Operaciones asociadas a archivos:
Abrir fichero,
Cerrar fichero,
Lectura y escritura,
Funciones de control.
1. INTRODUCCIÓN
Ya se pueden manejar gran cantidad de datos del mismo y diferente tipo al mismo tiempo (arrays y arrays de estructuras).
El problema es que el programa retiene los datos mientras esté ejecutándose y se pierden al terminar la ejecución.
La solución para hacer que los datos no se pierdan es almacenarlos en un fichero o archivo.
Los archivos son medios que facilita el lenguaje para almacenar los datos en forma permanente, normalmente en los dispositivos de almacenamiento estándar.
Desde el punto de vista informático, un fichero es una colección de información que almacenamos en un soporte magnético para poder manipularla en cualquier momento
Esta información se almacena como un conjunto de registros.
2. MANIPULACIÓN DE FICHEROS
En C++, se utilizan streams (flujos) para gestionar la lectura y escritura de datos. Ya conocemos dos flujos estándar: cin y cout.
En definitiva, abrir un fichero significa definir un stream. Dicho stream permite la transferencia de datos entre el programa y el fichero en disco.
El buffer es un área de memoria situada en la RAM asignada al programa que abre el archivo.
Toda transferencia de datos entre el programa y el fichero en disco se realiza a través del buffer.El buffer está para dar eficiencia.
Las operaciones de E/S son más eficientes:
- El acceso a la memoria RAM consume menos tiempo que el
acceso a un dispositivo físico.
- El buffer hace que el número de accesos al fichero físico sea
menor.
3. ORGANIZACIÓN DE ARCHIVOS
Archivos de acceso secuencial: los datos se almacenan de forma consecutiva y no es posible leer un registro directamente, es decir para leer el registro n hay que leer los n-1 registros anteriores.
Archivos de acceso aleatorio: se puede acceder a un registro concreto sin necesidad de leer todos los anteriores.
4. TIPO DE ALMACENAMIENTO EN ARCHIVOS
Archivos de texto: Los datos se almacenan usando código ASCII y por tanto, pueden ser procesados por cualquier editor de texto.
Archivos binarios: Los datos se almacenan en binario.
5. BIBLIOTECA DE FLUJOS
Para poder manipular archivos, C++ dispone de la biblioteca estandar fstream (file stream) donde se encuentran todas las funciones necesarias para abrir y cerrar archivos, así como para realizar las operaciones de lectura y escritura de datos en archivos.
6. OPERACIONES ASOCIADAS A ARCHIVOS
- Abrir fichero : - Para entrada o lectura
- Para salida o escritura : - en modo truncado
- en modo añadir
- Cerrar fichero
- Lectura y escritura
- Funciones de control
6.1 APERTURA DE ARCHIVOS
Al igual que los flujos cin y cout, los flujos de E/S solo pueden transferir datos en una dirección, esto significa que se tienen que definir flujos diferentes para lectura y escritura de datos.
6.1.1 Abrir el archivo para lectura o entrada
Abrir un archivo para entrada, es definir un flujo de archivo de entrada.
En el programa, nos referiremos al fichero utilizando el nombre del flujo.
6.1.1.1 Abrir el fichero para lectura: Ejemplo
Supongamos que queremos abrir un fichero que se llama misdatos.txt que se encuentra en la unidad de disco a:
Hemos definido el flujo de entrada leer_fich.
6.1.2 Abrir el fichero para escritura o salida
Abrir un archivo para salida, es definir un flujo de archivo de salida
Existen dos posibilidades:
- Si se abre un archivo en modo salida y dicho archivo ya existe, todos los datos almacenados serán sobreescritos.
- Si el archivo no existe, se creará.
6.1.2.1 Abrir el fichero para escritura: Ejemplo
Supongamos que queremos abrir un fichero para escribir datos. Dicho fichero se llama misdatos.txt y se encuentra en la unidad de disco a:
6.1.3 Abrir el archivo para añadir datos al final
Si se desea añadir en lugar de reemplazar los datos de un archivo existente, se debe definir un flujo de salida en modo append.
- Los datos adicionales escritos en el archivo, se añaden en su extremo final.
- Si el archivo no existe, se creará
Hemos definido el flujo de salida fich_tres en modo añadir.
ADVERTENCIA
Antes de seguir adelante, es aconsejable comprobar si el fichero se ha abierto correctamente, tanto si es para lectura, escritura.
Una vez definidos los flujos con los que va a trabajar nuestro programa,
se pueden utilizar los operadores de inserción(<<) y extracción(>>) y los
métodos ya conocidos de lectura de datos vistos para los flujos cin y cout.
6.2.1 Cierre de archivos
Cuando el programa ha terminado de manipular el fichero, éste debe cerrarse. Para cerrar un archivo, basta con ejecutar la función close sobre el flujo asociado al fichero.
6.3.1 Lectura de archivos de texto
La lectura de un archivo de texto se puede realizar con el operador de extracción (>>).
El operador >> lee hasta un blanco y omite los blancos.
La biblioteca estándar fstream.h nos proporciona funciones para el control de flujos. Ya las habíamos visto cuando analizamos el flujo estándar cin.
1. Lectura de cadenas, incluyendo caracteres en blanco:
2. Lee un carácter del flujo de entrada y devuelve falso cuando se ha alcanzado fin de fichero
6.4.1 Escritura de archivos de texto
La escritura de un archivo de texto se puede realizar con el operador de inserción ( <<).
Escribe un carácter en el flujo de salida
6.5.1 Funciones de control de flujos de archivos
La función eof, devuelve un valor distinto de cero si el flujo de entrada ha alcanzado el final del fichero:
Archivos en C ++
Creación:
El lenguaje C ofrece un amplio conjunto de funciones de librerías para crear y utilizar archivos de datos.
Lo primero que debemos hacer con los archivos de datos orientados a flujo es crear un área de buffer o de almacenamiento. Un área de buffer es un lugar de memoria que se usa para transferir datos desde la memoria a los dispositivos de almacenamiento secundario y viceversa.
Para crear el área de Buffer se puede utilizar la siguiente sintaxis:
FILE *buffer_ptr;
Donde FILE es un tipo de estructura que permite la definición de un área de buffer, y buffer_ptr es un puntero que apunta al inicio del área de buffer.
FILE debe escribirse siempre en mayúsculas, FILE está definida en la librería stdio.h.
Para ser procesado un archivo, primero debe de abrirse, al abrir un archivo se hace una asociación entre un nombre de archivo y el área del buffer.
También debe especificarse como los archivos de datos serán usados como : Solo lectura, Solo escritura o ambos.
Función de librería para abrir archivos ( fopen ) :
buffer_ptr= fopen (nombre_archivo,tipo_de_archivo)
nombre_archivo puede ser creado, por ejemplo en Gnu/linux,
mkdir nombre_archivo.txt
Cuando la función fopen se utiliza, retorna un puntero al inicio de la posición del área de buffer asociada con el archivo, si por algún motivo, razón o circunstancia, el archivo no puede ser abierto, se retorna un valor NULL o cero.
Al final de cada programa, un archivo de dato que ha sido abierto debe cerrarse al final, la función fclose
permite cerrar el archivo:
Al final de cada programa, un archivo de dato que ha sido abierto debe cerrarse al final, la función fclose
permite cerrar el archivo:
fclose(buffer_ptr;) Manipulación
Significado
"r" Abre un archivo que existe, solo lectura
"w" Abre a un nuevo Archivo para solo escritura
"a" Abre un archivo que existe para agregar al final. Si el archivo no existe, uno nuevo sera creado.
"r+" Abre un archivo existente para ambos lectura y escritura
"w+" Abre un nuevo archivo para escritura/lectura. Si un archivo con el mismo nombre existe, éste será borrado y un nuevo archivo será creado.
"a+" Abre un archivo que existe para lectura/escritura. Si el
archivo no existe un nuevo archivo será creado
archivo no existe un nuevo archivo será creado
realizar el procesamiento de archivos en C++.Para eso es necesario incluir los siguientes archivos de encabezado:
iostream.h
fstream.h
Tipos de archivos.
-Existen 2 tipos de archivo:
• Archivo de Acceso Secuencial
• Archivo de Acceso Aleatorio
Archivo de Acceso Secuencial :
- Para la manipulación de archivos de acceso tanto secuencial como aleatorio, es necesario crear un objeto a partir de las clases fstream, ifstream u ofstream de la siguiente manera.
fstream/ifstream/ofstream Name ( “filePath”, ios::mode )
- Que indica que se creará un objeto de la clase pertinente llamado Name que abre un archivo para salida, entrada o ambas, llamado filePath, mediante su constructor pertinente.
- Existen varios modos de apertura determinados por la etiqueta ios::mode de la diapositiva anterior.
– Para la escritura y lectura de un archivo de acceso secuencial se hace uso de los operadores de inserción y extracción de flujo de la clase iostream, << y >> respectivamente.
– Introduce datos que son escritos en el archivo.
Name << Data;
– Lee los datos desde el archivo y los deposita en alguna variable.
Name >> Data;
– Los programas pueden escribir o leer datos secuencialmente comenzando desde el inicio del archivo hasta encontrar el dato deseado o el marcador de fin de archivo (eof).
– La clase iostream proporciona las funciones miembro para ubicar o reubicar el Apuntador de Posición de Archivo.
seekg <istream> “Seek and Get”
seekp <ostream> “Seek and Place”
Archivo de Acceso Aleatorio
– Un registro es un conjunto de dimensiones finitas de campos relacionados.
– Los archivos de acceso aleatorio permiten la localización de registros de forma inmediata y directa, sin tener que buscar en todos los registros.
– Una técnica para crear archivos de acceso aleatorio es la de lograr que todos los registros tengan las mismas dimensiones, esto hace que para un programa sea más fácil calcular la localidad exacta del registro con relación al inicio del archivo y escribir en él sin tener que modificar todo el archivo.
– Se proporcionan la siguiente función miembro para la escritura y la lectura en un archivo de acceso secuencial.
write <ostream>
Es una función miembro que proporciona la salida a un número fijo de bytes, que se inicia en una localidad de memoria específica hacia un flujo especificado. Cada flujo está asociado con un archivo, escribiéndose los datos comenzando en la localidad del archivo especificada por el apuntador place.
read <istream>
Es una función miembro que proporciona la entrada a un número fijo de bytes desde un flujo especificado hacia una localidad de memoria que comienza en la localidad del archivo especificada por el apuntador get
– Los programas con procesamiento de archivos de acceso aleatorio, manipulan estructuras struct o class en vez de un solo campo.
– La sintaxis que tienen estas funciones son las siguientes:
fstream/ifstream/ofstream Name ( “filePath”, ios::mode )
Name.write(reinterpret_cast <const char *>
( &Struct_or_Class_to_Save ),
sizeof( Kind_of_Struct_or_Class ) );
– La función reinterpret_cast convierte la dirección de la estructura o clase a guardar a const char *.
Suscribirse a:
Entradas (Atom)


















