2. Un stream es una especie de canal a través
del cual fluyen los datos.
Técnicamente, un stream es el enlace
lógico utilizado por el programador en C,
C++ para leer o escribir datos desde y hacia
los dispositivos estándar conectados a la PC.
El dispositivo estándar para manipular
entradas es el teclado y está asociado al
objeto cin; el dispositivo estándar de
salida está asociado al objeto cout.
3. El almacenamiento de datos en variables y arrays
(arreglos) es temporal; los datos se pierden cuando
se termina el programa.
La mayoría de las aplicaciones requiere que la
información se almacene de forma persistente es
decir que no se borre cuando se termine la
ejecución del programa. Debido a esto se
requiere utilizar archivos (ficheros) para almacenar
de modo permanente grandes cantidades de
datos, incluso después de que los programas que
crean los datos se terminan.
4. 1. Un fichero se identifica por su nombre, el cual
generalmente está compuesto por:
• Path: Indica la ruta para encontrar el fichero
incluyendo la unidad de almacenamiento donde
se halla.
• Nombre
• Extensión: Son tres caracteres que sirven para
identificar el
tipo de fichero
Por ejemplo:
"C:Mis documentosapuntes.doc"
path
extensión
nombre
5. 2. Un fichero puede estar compuesto por registros,
cada uno de los cuales contiene información sobre
un elemento. Un registro está compuesto por
campos.
Ejemplo: Se tiene un fichero de registros o
estructuras Articulo
struct Articulo {
int codigo;
char descripcion[maxdesc];
float precio;
};
6. Secuencial: para acceder al elemento i-ésimo se
recorre desde el primer elemento hasta el
elemento i-1.
Ejemplo: El almacenamiento en una cinta(casette)
es de acceso secuencial.
Directo: para acceder al elemento i-ésimo se
hace directamente.
Ejemplo: El almacenamiento en un disco es de
acceso directo.
7. Secuencial: Las consultas de los registros se hace
secuencialmente desde el primer elemento hasta el elemento
i-ésimo.
Directa: Se establece una relación entre la clave del registro y
la posición del registro en el fichero.
Ejemplo: Se tiene un fichero de registros Articulo cuyo campo
clave es el código. Los códigos son números que van de 10 en
10, ej. 10, 20, 30, 40, 50, etc. Se realiza la siguiente función de
acceso F:
F (código) = código(10);
La cual que devuelve la posición del registro a partir del
código, y por lo tanto puede accederse a él directamente.
Indexada: Básicamente es una organización secuencial a la
que se le agrega una o más tablas de índices que permiten
acceder a los registros de manera más directa.
8. Existen operaciones que afectan a todo el
fichero, entre las cuales se enumeran:
Crear un fichero
Borrar un fichero
Ordenar un fichero según algún criterio de
orden
Fusionar dos ficheros para formar un tercer
fichero
Dividir un fichero en dos o más ficheros
9. Además, existen otras operaciones que
afectan a uno o más registros del
fichero, entre las cuales se enumeran:
Alta de un nuevo registro
Baja de un registro
Modificación de uno o más registros
Consulta de uno o más registros
10. Su sintaxis es:
nombre_fstream.operacion
Open(nombre_fichero, opciones): Puede usarse cuando en el
constructor se ignoró la apertura del fichero.
Ejemplo:
fichero1.open("prueba.txt", ios::in); esto antes de realizar
cualquier lectura.
close(): Cuando se desea cerrar un stream
Ejemplo:
fichero1.close(); esto después de haber realizado todas las
lecturas y/o escrituras.
eof(): Es una función que devuelve un valor diferente a 0
(TRUE) si se llegó al fin de fichero, de otro modo devuelve 0
(FALSE)
Ejemplo:
if (fichero1.eof()){
//fin de fichero, no hay más datos
}
11. is_open(): Es una función que devuelve un valor diferente a 0
(TRUE) si el fichero asociado al stream está abierto, de otro
modo devuelve 0 (FALSE).
Ejemplo:
if (fichero1.is_open()){
cout<<el fichero está abierto;
}
tellp(), es una función que devuelve como resultado la
posición actual (tipo pos_type) de un stream de salida.
seekp(posición, posición_inicial), sitúa el lugar de escritura
indicada en posición en forma relativa a posicion_inicial, la
cual puede ser ios::beg (comienzo), ios::cur (actual), ios::end
(fin).
12. Existe una manera de manipular ficheros en C++
mediante los denominados streams.
Un stream representa un flujo de información,
desde el programa a un dispositivo o periférico de
salida, o desde un periférico de entrada al
programa
La manera de utilizar un stream de entrada es:
stream_entrada >> variable;
La manera de utilizar un stream de salida es:
stream_salida << información.
13. Hasta el momento se han utilizado dos streams
predefinidos:
cin es un stream de entrada asociado al teclado
cout es un stream de salida asociado a la pantalla
Pueden definirse stream de entrada y/o salida y
asociarlos a un fichero, de manera que se puedan
recibir datos del fichero y/o enviar datos al fichero
respectivamente.
La librería que se debe utilizar es <fstream.h>.
Se debe declarar un stream mediante el constructor:
fstream nombre_stream (nombre_fichero, opciones);
14. Las opciones indican diferentes modos entre los
cuales se encuentran:
ios::in: Crea un stream de entrada, es decir, para
lectura de datos del fichero
ios::out: Crea un stream de salida, es decir, para
escritura de datos en el fichero
ios::ate: Hace que la posición inicial sea al final del
fichero
ios::app: Se sitúa al final del fichero antes de cada
escritura
ios::trunc: Borra cualquier cosa que pudiera haber en
el fichero
ios::nocreate: Si el fichero no existe fallará
ios::noreplace: Si el fichero existe fallará
ios::bin: Abre el fichero como binario
15. Ejemplo:
stream de salida asociado al fichero prueba.txt. Se borra
cualquier contenido del mismo.
fstream fichero1 ("prueba.txt", ios::out|ios::trunc)
stream de entrada asociado al fichero prueba.txt
fstream fichero2 ("prueba.txt", ios::in);
16. Cuando se quiere guardar información de
estructuras o registros en C/C++ se deben utilizar las
funciones de ficheros de la librería <stdio.h>.
Existe un tipo de datos denominado FILE por medio
del cual se manipulan los ficheros.
Entre las funciones definidas para trabajar con
ficheros se encuentran:
17. FILE* fopen (const char *name, const char *mode):
recibe como parámetros:
Un string name con el nombre del fichero
Un string mode con el modo de apertura del fichero que
puede ser:
"r" : abre fichero existente para lectura. Si no existe falla la
operación.
"w" : abre fichero para escritura. Si existe, sus contenidos se
borran.
"a" : abre fichero para escritura. Si existe, se agregan los datos
al final
"r+" : abre fichero para lectura y escritura. El fichero debe existir.
"w+" : abre fichero para lectura y escritura. Si existe, sus
contenidos se borran
"a+" : abre fichero para lectura y escritura. Si existe, se agregan
datos al final
18. int fclose (FILE *file)
La función fclose cierra el fichero abierto file.
size_t fread (void *pbuffer, size_t size, size_t number, FILE *file)
Se usa para leer desde el fichero, y recibe como parámetros:
Un puntero a FILE del fichero file desde el cual se quiere leer.
Un número number de tipo size_t que indica la cantidad de
elementos que se quiere leer.
Un número size de tipo size_t que indica el tamaño en bytes de
cada elemento.
Un puntero pbuffer a un lugar donde se copiarán los
elementos leídos.
size_t fwrite (void *pbuffer, size_t size, size_t number, FILE *file)
La función fwrite se usa para escribir en el fichero, y recibe los
mismos parámetros que la función fread.
19. int ftell (FILE *file)
La función ftell devuelve un int que indica el número
de bytes desde el comienzo hasta la posición donde
se encuentra el cabezal de lectura.
int feof (FILE *file)
Devuelve 0 mientras las lecturas hechas no lleguen al
final del fichero.
void rewind (FILE *file)
La función rewind sitúa el cabezal de lectura al inicio
del fichero.
20. Luís, Joyanes aguilar. (2003): “Fundamentos de Programación:
Algoritmos, Estructuras de Datos y Objetos.” Madrid.Mc-Graw
Hill. Cuarta edición. Páginas 201 hasta 346 (Capitulo #9) .
Anónimo, Fundamentos de informática [en
línea], Ficheros, Fecha de consulta: 28-12-2012, Disponible en:
http://dmi.uib.es/~abasolo/foninf/2002-2003/capitulos/6-
ficheros.html