Está en la página 1de 5

Procesamiento de datos I Lic: Juan Espinoza

ARCHIVOS EN C++

Práctica 5:

 Archivos de acceso aleatorio Definiciones.


 Funciones de lectura: seekg(), tellg() y read().
 Funciones de escritura: seekp(), tellp() y write().
 Ejercicios de implementación.

 Archivos de acceso aleatorio:


Permiten acceder directamente a un dato sin tener que pasar por
todos los demás, y pueden acceder a la información en cualquier
orden. Tienen la limitación de que los datos están almacenados en
unas unidades o bloques que se llaman registros, y que todos los
registros que se almacenan en un archivo deben ser del mismo
tamaño. Los archivos de acceso aleatorio son archivos binarios.

 Funciones de lectura:
1) seekg(): mueve la posición del cursor del archivo a la
posición relativa del archivo indicada para realizar la
operación de lectura.

Esta función tiene dos formatos:

_ seekg(pos): Mueve la posición actual del cursor hasta la


posición especificada en el valor entero pos para realizar la
operación de lectura.

_ Seekg(pos, modo): Realiza la misma función, a diferencia


que en el argumento modo, se referencia los movimientos
relativos dentro del flujo.

Los valores de modo son:

Enum sep_dir = {beg, cur, end}

Beg: Relativo al principio del archivo.


Cur: Relativo a la posición actual del archivo.
End: Relativo al final del archivo.

2)tellg(): devuelve la posición relativa actual del cursor


asociado al archivo de entrada y devuelve un –1 en caso de
existir algún error.

1
Procesamiento de datos I Lic: Juan Espinoza

3)Read(): ejecuta una lectura (a partir de la posición actual


del cursor) de num bytes del archivo y los coloca en una
variable.
Esta función tiene el siguiente formato:

istream& read(char*, int);

 Funciones de escritura:
2) seekp(): mueve la posición del cursor del archivo a la
posición relativa del archivo indicada para realizar la
operación de escritura.

Esta función tiene dos formatos:

_ seekp(pos): Mueve la posición actual del cursor hasta la


posición especificada en el valor entero pos para realizar la
operación de escritura.

_ Seekp(pos, modo): Realiza la misma función, a diferencia


que en el argumento modo, se referencia los movimientos
relativos dentro del flujo.

Los valores de modo son:

Enum sep_dir = {beg, cur, end}

Beg: Relativo al principio del archivo.


Cur: Relativo a la posición actual del archivo.
End: Relativo al final del archivo.

2)tellp(): devuelve la posición relativa actual del cursor


asociado al archivo de salida y devuelve un –1 en caso de
existir algún error.

3)write():escribe el número especificado de bytes en el flujo


asociado desde el búfer al que apunta cad (cad es un puntero
a un array de caracteres y num es el número de caracteres a
escribir). Su sintaxis es:

ostream& write(char* cad, int num)

 Ejemplos de implementación:
El siguiente programa permite almacenar secuencialmente 5 número
enteros, para luego recuperalos aleatoriamente desde el archivo
binario “archivo.dat”

#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>

2
Procesamiento de datos I Lic: Juan Espinoza

#include<conio.h>

int main()
{

ofstream fout("archivo.dat",ios::ate|ios::binary); //Abre el


archivo

int valor;

for(int i=0;i<10;i++)
{
cout<<"\nIntroduzca el valor ["<<i<<"]: ";
cin>>valor;
fout.write((char *)&valor,sizeof(valor)); //Escribe en el
archivo
}

fout.close(); //Cierra el archivo

ifstream fin("archivo.dat",ios::ate); //Abre el archivo

randomize();

int j;

for (int i=0;i<5;i++)


{

int pos=random(10);

cout<<"\nLa posicion es : "<<pos;

fin.seekg(pos*sizeof(int)); //Lee en forma aleatoria

fin.read((char *)&j,sizeof(j)); //Lee el dato en j

cout<<"\n El valor es : "<<j<<endl; //Muestra el resultado

fin.close(); //Cierra el archivo

getch();

return 0;

3
Procesamiento de datos I Lic: Juan Espinoza

El siguiente programa permite almacenar una lista de nombres


secuencialmente en un archivo binario “nombres.dat”, para luego
recuperarlos aleatoriamente.

#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<iomanip.h>
#include<stdio.h>
main()
{
char resp, nombre[10];
int a, b, c, d;

fstream letras("nombres.dat", ios::in| ios::out| ios::binary|


ios::app);

do
{
cout<<"\nIntroduzca el nombre: ";
gets(nombre);
letras.write(nombre, 10);
cout<<"\nDesea ingresar otro nombre: ";
cin>>resp;
}while(resp=='s');

clrscr();
do
{
letras.seekg(0, ios::end);
c=letras.tellg();
d=c/10;

do
{
cout<<"Registro a mostrar: ";
cin>>b;
}while(b>d);

a=(b-1)*10;
letras.seekg(a, ios::beg);
letras.read(nombre, 10);

cout<<setiosflags(ios::skipws)<<nombre<<endl;

cout<<"\nDesea mostrar otra persona: ";


cin>>resp;

}while(resp=='s');
letras.close();
getch();
}

4
Procesamiento de datos I Lic: Juan Espinoza

El siguiente programa permite inicializar un archivo con el


abecedario secuencialmente, para luego emplear las funciones de
archivos directos para la lectura/escritura en el mismo. En este
programa se emplearon las funciones de lectura/escritura byte a
byte usadas para archivos binarios.

#include <fstream.h>
#include <conio.h>

main()
{
char letra;

fstream letras("Letras.dat", ios::in|ios::out|ios::binary);

for(char letra='A'; letra<='Z'; letra++)


{
letras.put(letra);
}

letras.seekg(7, ios::beg); // obtiene la letra H


letra=letras.get();
letras.seekp(0, ios::end);
letras<<letra; // coloca la letra al final

letras.seekg(-13, ios::end); // obtiene la letra O


letra=letras.get();
letras.seekp(0, ios::end);
letras<<letra;

letras.seekg(-17, ios::end); // obtiene la letra L


letra=letras.get();
letras.seekp(0, ios::end);
letras<<letra;

letras.seekg(0, ios::beg); // obtiene la letra A


letra=letras.get();
letras.seekp(0, ios::end);
letras<<letra;

letras.seekg(-4, ios::end);

letras>>letra;
while(letras.eof()!=1)
{
cout<<letra;
letras>>letra;
}

letras.close();
getch();
}

También podría gustarte