Sunteți pe pagina 1din 26

Luis Lujan Avanzado

Visual Basic

Visual Basic - Gua del Estudiante Cap. 6 FICHEROS EN VISUAL BASIC


Existen tres tipos de ficheros donde podremos almacenar y leer datos: - Secuenciales - Aleatorios (Random) - Binarios Cada uno de ellos tiene sus aplicaciones y particularidades. FICHEROS SECUENCIALES Este tipo de ficheros nos permite guardar informacin de cualquier longitud. En este tipo de ficheros, la informacin se guarda coloc ando un carcter tras otro. La forma de leerlos es, igualmente, carcter tras carcter. (Byte tras byte). Son los mas sencillos de manejar, y los utilizados para guardar texto en ASCII. Permiten guardar datos en un fichero con un determinado nombre, "machacando" la informacin de otro posible fichero que ya estuviese en el disco con el mismo nombre, o aadir la informacin nueva a continuacin de la ya existente. Para abrir un fichero secuencial para guardar informacin, debemos ejecutar la siguiente instruccin: Open Nombrefichero For Output As # Numerocanal

De esta forma, si ya exista un fichero llamado Nombrefichero, sobreescribiremos dicho fichero perdiendo la informacin que contuviese. Es la forma tpica de hacerlo cuando modificamos un texto. Para aadir la nueva informacin tras la ya existente, deberemos abrirlo con la siguiente instruccin: Open Nombrefichero For Append As # Numerocanal Numerocanal debe ser un nmero comprendido entre 1 y 255. Representa el nmero del canal por donde introduciremos los datos. Normalmente se llama tambin nmero de archivo. No puede haber mas de un archivo abierto con un nmero de canal determinado. Para cerrar un fichero secuencial, basta con ejecutar la instruccin: Close # Numerocanal Si no se espec ifica Numerocanal (la instruccin Close a secas) se cerrarn todos los ficheros abiertos actualmente. Para introducir la informacin, pueden emplearse dos mtodos: Print y Write Nos centraremos de momento solamente en Print. Print Introduce la informacin de forma secuencial, byte tras byte tal como se coment. Sirve para guardar textos. Por ejemplo si deseamos guardar en ese fichero el contenido de una caja de texto llamada Text1, basta con ejecutar la siguiente instruccin:

Sistemas y Computacion

LuisLu

168

Luis Lujan Avanzado Print #NumerodeCanal, Text1.Text

Visual Basic

El texto queda en el fichero en caracteres ASCII, que se pueden leer con el Bloc de Notas.

Cuando los datos se han introducido con la instruccin Print, la forma de acceder a ese texto es muy sencilla: Se abre el archivo con la instruc cin Open Open Nombrefichero For Input As # Numerodecanal Se utiliza la instruccin Input o Line Input para sacar los datos del fichero. La instruccin Input tiene en este caso la siguiente sintaxis: VariableString = Input (Numero de caracteres, # Numero de canal) Por ejemplo, VariableString = Input (1, #1) extrae un carcter del fichero abierto como #1. El nmero mximo de caracteres a extraer de un golpe mediante la instruccin Input est limitado a 65.534. Ver un poco mas adelante la propiedad LOF de los ficheros secuenciales. LOF devuelve un valor igual a la longitud total del fichero. Si ejecutamos la instruccin : Para no emplear una palabra tan larga como Numerodecanal, utilizaremos de ahora en adelante el nmero 1 como nmero de canal. Recuerde que ese nmero puede ser un nmero comprendido entre el 1 y el 255 VariableString = Input (LOF(1), #1) LOF(1)=longitud del fichero #1

leeremos el fichero de una nica vez. Este procedimiento puede ahorrarle cierto tiempo a la hora de la lectura. (Por lo dicho anteriormente, este procedimiento de leer todo el fichero de un golpe solamente se podr hacer si la longitud del fichero (LOF(1)) es inferior a 65.534 bytes. Tenga esto presente cuando vaya a leer un fichero que no sabe que longitud tiene. Para curarse en salud, le recomiendo que lea los ficheros secuenciales carcter a carcter. Input(1,#X) pues tarda poco mas que leyndolo de un golpe. Claro que para leer un fichero carcter a carcter debe poner un bucle en el que se van leyendo los caracteres hasta que llaga al final del fichero.. La forma de hacer este bucle es la siguiente: Dim A As String A es la variable donde meteremos el carcter que extraemos del fichero. Dim MiVariable as String MiVariable es una va riable tipo string donde vamos a meter todo el contenido del fichero Do Until EOF(1) cuando lectura carcter siguiente A = Input (1, #1) caracteres El programa ejecutar este bucle hasta que se cumpla que EOF(1) sea True. EOF(NumerodeCanal) es una propiedad de los ficheros estn abiertos, que es True cuando la posicin del puntero de apunta al carcter Fin De Fichero (End Of File) que es el al ltimo carcter de texto de ese fichero. Estrae un carcter del fichero abierto por el canal nmero 1. Al leer este carcter, el puntero de lectura avanza automticamente tantos como haya ledo, colocndose sobre el primer carcter no ledo.

Sistemas y Computacion

LuisLu

169

Luis Lujan Avanzado MiVariable = MiVariable & A poner ese ver sera:

Visual Basic Con esta lnea vamos anexando el carcter ledo a MiVariable. En vez de utilizar una variable, texto sobre un TextoBox o un RichTextBox proximamente). Si lo ponemos en un RTB RTB.SelText = A la variable podramos (RTB) (Lo esta lnea

Loop Close #1

Vuelve al comienzo del bucle. Cierra el fichero

Slo se utilizar la instruccin Input con archivos abiertos en modo Input o Binary. (Los Binary Se vern a continuacin) A diferencia de la instruccin Input #, (la veremos a continuacin, pues es la instruccin que deber utilizar para leer archivos escritos con la instruccin Write ), Input devuelve todos los caracteres que lee, incluyendo puntos y coma, retornos de carro, avances de lnea, comillas y espacios iniciales. Existe una instruccin, Input$ , que asume que el dato a leer es un String. (Cadena de caracteres). Puede ahorrar un poco de memoria usando esta instruccin en lugar de Input. Nota Se proporciona otra funcin (InputB) para su uso con datos de byte incluidos en archivos de texto. En lugar de especificar el nmero de caracteres a devolver, nmero especifica el nmero de bytes. INSTRUCCION LINE INPUT La instruccin Line Input se utiliza para extraer una lnea completa. Tiene la siguiente sintaxis: Line Input # Nmero de canal, VariableString Mediante esta instruccin se extrae una lnea completa (los caracteres delimitados entre dos retornos de carro), y se le asigna esa cadena a VariableString Una lnea es un trozo de texto delimitado por los caracteres 13 (Retorno de carro) y 10 (Avance de lnea) La instruccin Line Input # lee un carcter cada vez en un archivo hasta que encuentra un retorno de carro (Chr(13)) o una secuencia retorno de carro - avance de lnea (Chr(13) + Chr(10)). Las secuencias de retorno de carro - avance de lnea no se tienen en cuenta y no se aaden a la cadena de caracteres extrada mediante esta instruccin. Cuando lea un archivo mediante Line Input # y lo quiere presentar en un TextBox o en el Printer, deber introducirlos para evitar que le salga todo el texto en una nica lnea. Con lo que se ha explicado, ya puede realizar un pequeo edito de textos. Este sencillo editor tiene un TextBox llamado TBTexto , donde podemos escribir el texto que queramos (con la propiedad MultiLine = True y ScrollBars = Vertical), tres botones llamados BAbrir (1), (2 a y b) y (3), para abrir el fichero y poner su contenido en TBTexto, y dos BGuardar para guardar, uno abriendo el fichero For Append y el otro abrindolo For Output. En este ltimo, al guardar el texto borramos el contenido que del fichero, si ya existiera. En el primero, lo anexamos al final del mismo . Para conocer el nombre del fichero, ponemos un CommonDialog llamado CD1, con un filtro CD1.Filter = Ficheros de Texto |*.txt Para abrir el fichero, y depositar su contenido en TBTexto pondremos este cdigo en BAbrir : Private Sub BAbrir1_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen
Sistemas y Computacion LuisLu

170

Luis Lujan Avanzado Open CD1.filename For Input As #1 VarTexto = Input(LOF(1), #1) 'leemos todo el fichero de un golpe Close #1 TBTexto = VarTexto End Sub

Visual Basic

Cuando el fichero es mayor de 64 kilobytes, el leerlo de un golpe puede dar problemas. Mejor dicho, no funciona. Deberemos leerlo en ese caso, carcter a carcter o lnea a lnea. Para leer carcter a carcter : Private Sub BAbrir_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen Open CD1.filename For Input As #1 Do Until EOF(1) Hacemos un bucle de lectura hasta que encontremos EOF(1) Vea mas adelante la Propiedad EOF en Propiedades de los ficheros Secuenciales VarTexto = Input(1, #1) 'leemos el fichero carcter a carcter TBTexto = TBTexto & VarTexto 'vamos aadiendo los caracteres ledos a TBTexto Loop Close #1 End Sub (NOTA.- Lo expuesto funciona perfectamente, pero el hecho de meter en un TextBox carcter a carcter eterniza la aplicacin. - Meter un texto en un TextBox o en un Label es una operacin que tarda cierto tiempo. Si esa operacin hay que hacerla una vez por carcter, puede tardar mucho tiempo. Para evitar esto, cuando vaya a leer un fichero carcter a carcter, mtalo primero en una variable y luego realice un volcado nico de esa variable al TextBox o Label) Y podemos hacerlo tambin leyendo lnea a lnea con Line Input Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowOpen Open CD1.filename For Input As #1 Do Until EOF(1) Line Input #1, VarTexto 'leemos el fichero Lnea a Lnea TBTexto = TBTexto & VarTexto & vbCrLf 'vamos aadiendo las lneas ledas a TBTexto '(Hay que introducir un retorno + avance de lnea con cada lnea (vbCrLf), ya que VarTexto no contiene los retornos ni avances de lnea. Loop Close #1 Los Botones de Guardar tienen el cdigo : Private Sub BGuardar_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowSave Open CD1.filename For Output As #1 Print #1, TBTexto.Text Close #1 End Sub O para el caso de abrir con For Append

Sistemas y Computacion

LuisLu

171

Luis Lujan Avanzado Private Sub BGuardar2_Click() Dim VarTexto As String CD1.Filter = "Ficheros de Texto |*.txt" CD1.ShowSave Open CD1.filename For Append As #1 Print #1, TBTexto.Text Close #1 End Sub

Visual Basic

Ya hemos visto como se guardan y se leen datos de texto en un fichero secuencial. INSTRUCCIN WRITE La otra forma de introducir datos en un fichero secuencial es Write. Mediante esta instruccin, no se puede introducir texto, sino datos, aunque esos datos sean de texto. Mediante la instruccin Write puede crear una pequea base de datos. Eso s, una base de datos de escasa calidad. Pero no es momento de cuestionar la calidad de esta base de datos, sino de explicarla. Write Puede introducir varias informaciones, que posteriormente se podrn leer de forma separada con la instruccin Input #. Esta forma de introducir datos en un fichero secuencial permite realizar un fichero con distintos datos que se pueden leer en el propio fichero, puesto que se guardan en ASCII, y leerlos mediante el programa de una forma muy sencilla. Hacemos, en realidad, una pequea base de datos. (Ver a lo largo de su vida profesional que lo de pequea no es cierto, pues es la forma mas sencilla de guardar datos cuando la cantidad de estos datos no es muy grande) Lo que estamos haciendo en realidad al escribir datos mediante la instruccin Write es escribir estos datos en un fichero secuencial, utilizando una coma como separador entre los distintos datos. Un fichero secuencial con datos introducidos mediante la instruccin Write tendr esta forma : Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51 Miguel de Cervantes,El Qijote,Editorial YY,5000,27 Observe que el contenido de este fichero se diferencia algo de una simple sucesin de caracteres. Tiene varias partes separadas por una coma. Cada una de ellas es un dato. Imaginemos una aplicacin, con la que introducimos datos de libros. La aplicacin es un nico formulario donde podemos introducir la informacin mediante varios TextBox. Existe un Botn de comando con el siguiente cdigo: Private Sub Command1_Click() TITULO = LIBRETBTITULO.Text AUTOR = LIBRETBAUTOR.Text EDITORIAL = LIBRETBEDITORIAL.Text PRECIO = LIBRETBPREC.Text EXISTENCIAS = LIBRETBEX.Text Donde LIBRETBTITULO, LIBRETBAUTOR, Etc. son los nombres de los TextBox Ha ledo los datos de los TextBox. Ya estn el las variables TITULO, AUTOR, Etc. Ahora los metemos en el fichero con la instruccin Write. El nombre del fichero ser el que hayamos puesto en el TextBox LIBRETBFICHERO, y lo guardar en el directorio C :\cursoVB Open TBNombreFichero.Text For Append As #1
Sistemas y Computacion LuisLu

172

Luis Lujan Avanzado Write #1, TITULO, AUTOR, EDITORIAL, PRECIO, EXISTENCIAS Close #1 End Sub

Visual Basic

Si introduce los datos del ejemplo anterior, se crear un fichero que tiene esta apariencia: Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51 Si realizamos otra introduccin de datos, con la segunda lnea del ejemplo anterior, los datos existentes en ese fichero no se borrarn, dado que lo hemos abierto con Append. Quedar de la siguiente forma: Luis Surez, VisualBasic - Gua del estudiante,Editorial XX,3200,51 Miguel de Cervantes,El Qijote,Editorial YY,5000,27 Que pasara si leemos este fichero con la instruccin Input o Line Input # vista anteriormente ? Pues simplemente que lo leeramos tal como est, con sus comas y comillas dobles. No sera la forma mas adecuada, ya que lo que queremos es obtener sucesivos datos de autores, ttulos, editoriales, precios y existencias. Para sacar estos datos debemos leerlos con la instruccin Input #. Esta instruccin saca los datos que hemos metido, es decir, elimina las comillas y la coma que servan de separadores. En nuestro ejemplo, podramos hacerlo de esta forma, aprovechando los mismos TextBox: Private Sub Command2_Click() ' Limpiamos los TextBox LIBRETBTITULO.Text = "" : LIBRETBAUTOR.Text = "" : LIBRETBEDITORIAL.Text = "" LIBRETBPREC.Text = "" : LIBRETBEX.Text = "" 'Abrimos el fichero Open TBNombreFichero.Text For Input As #1 Do Until EOF(1) ' Introducimos una parada para poder leer datos DETENERSE = True Input #1, TIT, AUT, NED, PRE, EXS LIBRETBTITULO.Text = TIT LIBRETBAUTOR.Text = AUT LIBRETBEDITORIAL.Text = NED LIBRETBPREC.Text = PRE LIBRETBEX.Text = EXS ' Refrescamos los TextBox Refresh ' Esto produce una pequea parada Do While DETENERSE = True A=A+1 If A = 100000 Then DETENERSE = False: A = 0 Loop ' termin la parada y vuelve a leer datos Loop Close #1

Sistemas y Computacion

LuisLu

173

Luis Lujan Avanzado End Sub

Visual Basic

Observe que los nombre de las variables en el proceso de lectura tienen distintos nombres a los utilizados durante la escritura. Como en el fichero no se guarda ninguna referencia al respecto, lo nico que importa es que el nmero de variables para la lectura sea igual al nmero de variables que se utiliz para la escritura, y que el orden de las variables sea correcto. Si por ejemplo, el nmero de variables usadas en la introduccin de datos fuese distinto al nmero de variables usado en la lectura, Visual Basic nos dara un error. Observe tambin que se ha introducido un temporizador. Sirve para ver los sucesivos ttulos que tenemos en nuestra base de datos tan sui generis. Se ha pretendido presentar unos datos de esta pequea base de datos sin complicarnos mucho la vida. Mas adelante veremos como presentarlos de una forma correcta. Este tipo de ficheros no es el mas adecuado para construir bases de datos, es complicado manejar ficheros de mas de unas pocas lneas, por lo que para tener muchos datos, este tipo de ficheros no es recomendable. No es aconsejable ni para muchos datos ni para pocos datos. Pero es obligacin del autor explicarlo y de advertirlo. En esta pequea aplicacin mostrbamos las informac iones sucesivamente segn las bamos leyendo del fichero. Interrumpamos momentneamente la lectura para presentar cada informacin durante un instante, ya que como tenemos cinco datos distintos en cada registro y cinco TextBox para presentarlos, deberemos presentar una informacin tras otra. Esto no parece en principio una solucin prctica para una base de datos, donde lo que interesa es disponer de todos los datos para usarlos cuando sea necesario. Esto nos lleva a crear una matriz para albergar todos los datos de la base, ya que los ficheros secuenciales se leen y se les tiene que extraer toda la informacin de un golpe, ya que no permiten ir a leer hacia atrs. Por lo tanto, si deseamos disponer de todos los datos, deberemos guardarlos en la memoria, en una matriz. Imagnese que estamos tratando datos de varios miles de libros en el ejemplo anterior. Si la informacin de cada campo es medianamente extensa, no tendramos memoria RAM suficiente en el ordenador para albergarlos. Esto nos lleva a pensar en otro tipo de archivo que veremos a continuacin, los Random (aleatorios), que permiten leer solamente los registros que nos interesan. Pero volvamos a nuestra aplicacin de librera, donde hemos hecho una variacin, los campos PRECIO y EXISTENCIAS los vamos a tratar ahora como nmeros (Integer). Tambin se ha introducido otro campo tipo texto, para introducir la edicin. El fichero creado tras introducir varios libros qued de la siguiente forma : "EL RODABALLO","GUNTER GRASS","PLANETA",1995,2000,12 " VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21 "EL NOMBRE DE LA ROSA","UMBERTO ECO","AGUILAR",28,1000,21 "ENCICLOPEDIA DEL VB","CEBALLOS","RAMA",CUARTA,1200,23 "LA GRANJA ANIMAL","ORWELL","DESTINO",45,12000,78 "LA PASION TURCA","ANTONIO GALA","PLANETA",SEGUNDA,2500,25 "LA METAMORFOSIS","KAFKA","PLAZA&JANES", 4,3400,101 "VB4 PARA WINDOWS95","GARY CORNELL","MCGRAWHILL",1,6500,25 Observe que los dos ltimos campos (correspondientes a PRECIO y EXISTENCIAS) no estn entre comillas, pues no se trata de texto, sino de nmeros. (Observe tambin la gran ventaja de tener una base de datos con datos completamente legibles) Se han introducido alguna variaciones en el programa. Entre ellas, se crea una matriz de variables de 5 x n (n=nmero de registros). Tambin se le aaden unos botones para poder recorre toda la base de datos. La interfaz grfica qued de la siguiente forma :

Sistemas y Computacion

LuisLu

174

Luis Lujan Avanzado

Visual Basic

El programa necesita que le introduzcamos el nombre del fichero que alberga la base de datos. Por sencillez no se ha usado ningn CommonDialog y se introduce directamente el nombre de este fichero en un TextBox llamado TBNombreFichero El fichero anterior podemos leerlo tal y como indicbamos antes : Open TBNombreFichero.Text For Input As #1 Do Until EOF(1) Input #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS Donde las variables TITULO, AUTOR, EDITORIAL y EDICION sern del tipo String y PRECIO y EXISTENCIAS sern de tipo numrico. Podemos saberlo, ya que en una lnea cualquiera del fichero anterior : " VisualBasic - Gua del Estudiante ","LUIS SUAREZ","CEU",PRIMERA,1000,21 los cuatro primeros parmetros van entre comillas dobles, ya que son datos tipo texto, y los dos ltimos van sin comillas, como corresponde a datos numricos. Pero existe otra forma mejor (al menos un poco mas complicada) para leer estos datos, y evitar el problema que tenamos antes de tener que hacer un temporizador para poder ver, aunque solo sea un momento, los datos. Podemos meter los datos a una matriz que tenga tantas columnas como datos (campos) (en el ejemplo 6, cuatro String y dos numricos), y tantas filas como apuntes (registros) tengamos. Para ello, antes de nada debemos definir un tipo de variable, mediante la instruccin Type. Parece que no nos basta con los tipos de variable que trae VB (Long, String, Integer ...) y es cierto. La variable que necesitamos no es de ningn tipo de esos. Est compuesta por varias secciones, y cada una de ellas puede ser de un tipo distinto. Este tipo de definiciones debe hacerse en un mdulo (Vase instruccin Type en la ayuda de VB), por lo que se ha creado un mdulo llamado LIBREMD2.BAS, con el siguiente cdigo : Type REGISTROLIBRO AUTOR As String TITULO As String
Sistemas y Computacion LuisLu

175

Luis Lujan Avanzado EDITORIAL As String EDICION As String PRECIO As Integer EXISTENCIAS As Integer End Type

Visual Basic

Esto es lo que se llama DEFINIR una variable. Es como hacerse un traje a medida. Y dese cuenta de que es un tipo de variable (REGISTROLIBRO) formado por varias partes (AUTOR, TITULO, Etc.) Observe que DEFINIR una variable NO es lo mismo que DECLARAR En el apartado de Declaraciones del General del formulario declaramos las variables, entre ellas una variable, REGISTROLIBROS, de la cual decimos que va a ser una matriz mediante los parntesis que la acompaan, y adems declaramos que va a se similar a REGISTROLIBRO ya definida en el mdulo. Dim NR As Integer Dim REGISTROLIBROS() As REGISTROLIBRO Dim NRP As Integer Observe que al usar parntesis al declarar la variable REGISTROLIBROS le estamos diciendo a VB que esa variable ser un Array, y adems que es una variable del tipo REGISTROLIBRO, tipo de variable que ya conoce, puesto que se la hemos definido en un mdulo. En el ejemplo preparado podemos escribir y leer datos. Veamos de nuevo como se escriben El cdigo del procedimiento click del botn BIntroducir1 es : Private Sub BIntroducir1_Click() TITULO = LIBRETBTITULO.Text TextBox para introducir el ttulo AUTOR = LIBRETBAUTOR.Text autor EDITORIAL = LIBRETBEDITORIAL.Te xt editorial EDICION = LIBRETBEDICION.Text edicin PRECIO = Val(LIBRETBPREC.Text) precio EXISTENCIAS = Val(LIBRETBEX.Text) existencias (Observe que para introducir el precio y las existencias se transform el contenido del TextBox a un valor numrico mediante la instruccin Val.) Open "C:\cursoVB\" + LIBRETBFICHERO.Text For Append As #1 Write #1, TITULO, AUTOR, EDITORIAL, EDICION, PRECIO, EXISTENCIAS Close #1 End Sub Tras reiteradas entradas, el fichero de la BD qued como se vio anteriormente. Al leer los datos, lo primero es que no conocemos el nmero de registros existentes. Como cada registro va en una lnea del fichero, si contamos el nmero de retornos de carro (Chr(13)) obtendremos el nmero de registros. Esta operacin es la primera que se realiza en el procedimiento click del botn LEER : Private Sub Command2_Click() LIBRETBTITULO.Text = "" LIBRETBAUTOR.Text = "" LIBRETBEDITORIAL.Text = "" LIBRETBEDICION.Text = "" LIBRETBPREC.Text = "" LIBRETBEX.Text = ""
Sistemas y Computacion

Pone todos los TextBox en blanco

LuisLu

176

Luis Lujan Avanzado NR = 0

Visual Basic NR=nmero de registros

Abre el fichero, lo lee entero y cuenta el nmero de retornos de carro. Existirn tantos apuntes (registros) como retornos de carro existan, ya que cada registro ocupa una lnea. Open TBNombreFichero.Text For Input As #1 Do Until EOF(1) A = Input(1, #1) If A = Chr(13) Then NR = NR + 1 Loop Close #1 Presenta en LNumFich el nmero de registros LNumFich.Caption = Str(NR) + " Registros)" 'Redimensionamos la matriz de REGISTROLIBROS a NR elementos.. ReDim REGISTROLIBROS(1 To NR) Volvemos a abrir el fichero Open TBNombreFichero.Text For Input As #1 Leemos los registros del 1 al NR, y cada campo del fichero lo vamos asignando a los elementos que componen la matriz. For I = 1 To NR Input #1, REGISTROLIBROS(I).TITULO Input #1, REGISTROLIBROS(I).AUTOR Input #1, REGISTROLIBROS(I).EDITORIAL Input #1, REGISTROLIBROS(I).EDICION Input #1, REGISTROLIBROS(I).PRECIO Input #1, REGISTROLIBROS(I).EXISTENCIAS Next I Close #1 NOTA.- Estas lneas podramos heberlas puesto en una lnea nica : Input#1,REGISTROLIBROS(I).TITULO,REGISTROLIBROS(I).AUTOR,_ REGISTROLIBROS(I).EDITORIAL,REGISTROLIBROS(I).EDICION,_ REGISTROLIBROS(I).PRECIO, REGISTROLIBROS(I).EXISTENCIAS

NRP = Nmero del Registro Presentado. Lo hacemos igual a 1 para presentar, de momento, el nmero 1 NRP = 1 LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS End Sub Copiamos este cdigo de presentacin de datos y lo llevamos a las flechas de incrementar o disminuir el nmero del registro a presentar.
Sistemas y Computacion LuisLu

177

Luis Lujan Avanzado

Visual Basic

Private Sub BMas1_Click() NRP = NRP + 1 If NRP > NR Then protegemos que salga error de NRP fuera de intervalo MsgBox "No existen mas registros en esta direccin" NRP = NR Else LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS End If End Sub Esta es la de incrementar. La de disminuir es igual, pero restando 1 a NRP Las flechas dobles llevan al registro 1 y al ltimo. Tienen este cdigo Private Sub BMas2_Click() NRP = NR LIBRETBTITULO.Text = REGISTROLIBROS(NRP).TITULO LIBRETBAUTOR.Text = REGISTROLIBROS(NRP).AUTOR LIBRETBEDITORIAL.Text = REGISTROLIBROS(NRP).EDITORIAL LIBRETBEDICION.Text = REGISTROLIBROS(NRP).EDICION LIBRETBPREC.Text = REGISTROLIBROS(NRP).PRECIO LIBRETBEX.Text = REGISTROLIBROS(NRP).EXISTENCIAS End Sub Observe que es muy sencillo trabajar con ficheros secuenciales para bases de datos. El inconveniente es la cantidad de memoria necesaria para la matriz de datos. Tambin tienen un gran inconveniente: solamente se pueden leer de hacia adelante. Un fichero secuencial hay que leerlo de una sola vez. Esto que no es ningn inconveniente para un fichero de texto, o incluso para un fichero de datos que leemos una nica vez, es un problema cuando leemos un dato situado en un punto de ese fichero, y luego tenemos que leer un dato colocado en una posicin anterior. En este caso, deberemos terminar de leerlo, y volver a comenzar por el principio. Este es un gran inconveniente para hacer bases de datos con ficheros secuenciales. No solamente hemos visto una forma de crear una base de datos, sino que hemos visto como movernos a lo largo de los registros. Ver esto con mucho mas detalle cuando demos bases de datos. Este tipo de bases de datos son la Tipo Texto que ver mas adelante. Propiedades de los ficheros Secuenciales: EOF Indica el fin del fichero (End Of File). EOF ser False hasta que encuentre el final del fichero secuencial. Habr observado instrucciones tales como: Do until EOF(1) (Hazlo hasta que encuentres el EOF del canal 1) Do While Not EOF(1) (Hazlo mientras EOF del canal 1 sea False) Estas expresiones se usan en un bucle, para ir extrayendo con la instruccin Input o Line Input los caracteres de un fichero hasta que se encuentre la marca de final de fichero (EOF) LOC
Sistemas y Computacion LuisLu

178

Luis Lujan Visual Basic Avanzado Devuelve la posicin de lectura/escritura actual en un archivo abierto. La sintaxis de esta propiedad es: LOC (Numero de canal) la informacin devuelta para un archivo secuencial es la posicin de byte actual en el archivo, dividida por 128. LOF Devuelve la longitud de un fichero (Lenght Of File) abierto mediante Open. Sintaxis LOF(numeroarchivo)

Ejemplo Long = LOF (1) Observaciones Para obtener la longitud de un archivo que no est abierto utilice la funcin FileLen. (Vala mas abajo) SEEK Devuelve la posicin actual de lectura/escritura de un archivo abierto con la instruccin Open. Sintaxis Seek(nmeroArchivo)

Seek devuelve un valor entre 1 y 2,147,483,647 (equivalente a 2^31-1) inclusive. Para archivos abiertos en modo Output, Append o Input, Seek devuelve la posicin de byte en la que se va a ejecutar la siguiente operacin. El primer byte de un archivo est en la posicin 1, el segundo en la posicin 2 y as sucesivamente. FICHEROS ALEATORIOS (RANDOM) Un fichero aleatorio es un conjunto de registros, todos ellos de la misma longitud, que nos permite guardar varias colecciones de datos. Tal como habamos visto en los ficheros secuenciales, el almacenar una serie de colecciones de datos en un fichero secuencial era muy fcil, pero bastante difcil de almacenarlas en la memoria cuando el nmero de estas colecciones superaba una cierta cantidad. Los ficheros aleatorios permiten almacenar informacin en registros que pueden ser fcilmente ledos, pudiendo leer los registros uno a uno, sin necesidad de leerlos todos. En los archivos secuenciales, la informacin de varios datos podamos introducirla mediante la instruccin Write, y conseguamos un registro de la forma: (Recurdese el ejemplo de los datos de un libro) "Ttulo","Autor","Editorial","Edicin","Precio","Existencias" Si desebamos guardar la informacin de muchos libros, no haba mucho problema para guardarla, pero s para almacenarla en memoria para poder usarla luego. Tenamos que leer todo el fichero, y extraer de l la coleccin de informaciones y guardarlas en una matriz. Cambiar una informacin d entro del fichero secuencial tambin implica una complicacin adicional, ya que debemos rehacer el fichero completo, pues un fichero secuencial no permite remendar el trozo que queremos cambiar. Los ficheros aleatorios nos permiten guardar una informacin similar a la anterior, referida a cualquier nmero de libros, y para leerla no es necesario leer todo el fichero, sino simplemente acceder a los registros que nos interesen. Tambin permite realizar el cambio de un registro de una forma sencilla, sin alterar los dems. Todo esto tiene un precio: En los archivos secuenciales, podamos introducir informaciones de cualquier longitud. En los archivos aleatorios cada dato tiene una longitud asignada, longitud que no se puede sobrepasar, y si la informacin que debemos almacenar tiene menos que la longitud
Sistemas y Computacion LuisLu

179

Luis Lujan Avanzado preestablecida, perderemos esa capacidad sobrante. Para abrir un fichero aleatorio debemos emplear la expresin:

Visual Basic

Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro Nombrefichero es el nombre que queremos dar al fichero Numerocanal es el nmero del canal (nmero de fichero) que puede ser de 1 a 255 LogitudRegistro es la longitud total del registro. Un fichero aleatorio (Random), una vez abierto, puede utilizarse para leer o escribir datos. Para escribir datos en un fichero aleatorio, primero debemos definir el registro, es decir, en el caso de los libros visto anteriormente, un registro va almacenar los datos del titulo, autor, editorial, etc. Para "saber" como se colocan estos datos dentro del registro ser necesario definirlo. En realidad lo que vamos a hacer es definir una variable de las denominadas Definidas por el usuario Con esto lo que hacemos es crear un nuevo tipo de variable, en el ejemplo, la variable tipo Registro. Se debbe hacer en la seccin de declaraciones de un mdulo o de un formulario, y siempre antes de declarar una variable como variable de ese tipo. (La definicin de la variable debe hacerse en la seccin de declaraciones del mdulo o formulario con mbito suficiente para que sea vlida en todas las partes de la aplicacin donde se necesite esa variable) Podemos hacerlo con la instruccin Type: Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edicin As String * 6 Precio As String * 4 Existencias As String * 3 End Type

Asignamos 30 caracteres para el ttulo Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edicin Asignamos 4 caracteres para el precio Tres caracteres para ex istencias.

Observe la diferencia de esta definicin con la que hacamos en los ficheros secuenciales. En aquellos no ponamos la longitud de cada seccin. Aqu es necesario, ya que la longitud de un registro (y tambin de cada campo) es fija. Ya una vez definido como es Registro, podemos decir que una variable es del tipo definido para Registro, es decir : Dim MiVariable as Registro

Entonces MiVariable ya puede almacenar los datos de Titulo, Autor, Editorial, Edicin, Precio y Existencias, colocando un dato tras otro, sin ninguna separacin, en el mismo orden que lo habamos definido para Registro. No es necesario utilizar separaciones ya que el programa sabe que longitud tiene cada dato y el orden de colocacin. Lo sabe porque se lo hemos dicho al definir Registro. Si los datos a introducir son : Titulo : Autor : Editorial : Edicin : Precio : Existencias :
Sistemas y Computacion

Gua del Estudiante Luis Surez Bernaldo Ediciones XX 2 3500 25


LuisLu

180

Luis Lujan Avanzado el registro correspondiente a este libro tendr una forma mas o menos as :

Visual Basic

Gua del Estudiante///////////Lus Surez Bernaldo//////////Ediciones XX///2////350025/ donde se ha sustituido el carcter nulo por una barra ( / ) con el fin de hacerlo visible en el texto. Si se molesta en contar los caracteres que tiene el registro observar que son 88, que es la suma de 30 + 30 + 15 + 6 + 4 + 3 que son los caracteres asignados a cada uno de las partes que forman el registro (Ttulo, Autor, etc.) Para hablar con propiedad, a esas partes que componen el registro lea vamos a llamar CAMPOS. Un Registro est formado por varios Campos, y cada Campo contiene una informacin. Imagnese que introducimos otro libro. El primer campo de ese nuevo registro se colocar en el fichero inmediatamente despus del ltimo campo existente, sin ningn tipo de separacin. No hace falta esa separacin, pues VB conoce donde finaliza un registro y comienza otro, ya que la longitud total del registro se le ha introducido en la instruccin para abrir el fichero, que repetimos aqu por comodidad : Open Nombrefichero For Random As # Numerocanal Len = LongitudRegistro (Si se omite el dato LongitudRegistro VB colocar la longitud por defecto, 128 caracteres) LongitudRegistro deber ser igual o mayor que la suma de caracteres de cada uno de los campos declarados en la instruccin Type, que tambin reproducimos :

Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edicin As String * 6 Precio As String * 4 Existencias As String * 3 End Type

Asignamos 30 caracteres para el ttulo Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edicin Asignamos 4 caracteres para el precio Tres caracteres para existencias.

Deber ser igual o mayor, o estrictamente igual ? La respuesta es igual o mayor. Pero si declaramos en la instruccin Open que el registro es mayor que la suma de los caracteres de todos los campos que lo componen, estaremos perdiendo espacio de disco duro, tanto como la diferencia entre lo declarado e la instruccin Open menos la suma de los caracteres de cada n uno de los campos. Y esa cifra, multiplicada por el nmero de registros existentes. Por lo tanto debe declararse en la instruccin Open exactamente la suma de los caracteres de todos los campos. En el ejemplo anterior era bastante fcil, ya que todos los campos eran del tipo String (cadena de caracteres) y cada carcter ocupa un byte. La cosa se complica si uno o varios de los campos son de tipo numrico, porque nos obligar a recordar cuantos by tes ocupa un integer, un Long, etc. Si hubisemos declarado en la instruccin Type Precio as Long, Existencias as Integer deberamos tener en cuenta que un Long (nmero entero entre -2.147.483.648 y 2.147.483.647, inclusive) ocupa 4 bytes y un integer (nmero entero entre -32.768 y 32.767) ocupa 2 bytes. Se reproduce a continuacin la longitud en Bytes de cada uno de los tipos de datos. No se moleste en aprendrsela de memoria, pues en la Ayuda de Visual Basic puede encontrarla como Resumen de tipos de da tos. Pero fjese en algo tan curioso como que un dato tipo Boolean que solamente puede tomar 2 valores (S / No) ocupa 2 bytes frente a un dato tipo Byte, que puede tomar 256 valores y ocupa solamente un Byte.

Tipo de Dato Byte


Sistemas y Computacion LuisLu

Ocupa 1 byte 181

Luis Lujan Avanzado Boolean Integer Long(entero largo) Single(coma flotante Simple precisin) Double(coma flotante Doble Precisin) Currency Date Object String (longitud v ariable) String (longitud fija) Variant (con nmeros) Variant (con caracteres)

Visual Basic 2 bytes 2 bytes 4 bytes 4 bytes 8 bytes 8 bytes 8 bytes 4 bytes 10 bytes + longitud de cadena longitud declarada de la cadena 16 bytes 22 bytes + longitud de cadena

Ya le estoy viendo tomando buena nota de cuanto ocupa cada variable. Y echando nmeros para saber la longitud exacta de la variable y no perder ningn byte del disco duro desaprovechndolo sin informacin. No habr algo que nos lo facilite ? S, lgicamente. La instruccin LEN

LEN nos da la longitud de un texto (V ar=Len (Hola que tal), o de una variable Var=Len(Variable) Podemos usarla para conocer la longitud total de la variable MiVariable LongitudRegistro = Len (MiVariable) Pero si quiere reducir mas la cosa, abra el fichero de esta forma : Open Nombrefichero For Random As # Numerocanal Len = Len (MiVariable)

Ni que decir tiene que si se abre ese fichero en varias partes del programa con distintas instrucciones Open el valor de LongitudRegistro debe ser igual en todas ellas. La declaracin del registro mediante la instruccin Type debe hacerse en la seccin de declaraciones de un Mdulo. Esta instruccin Type en realidad lo que est haciendo es definir un nuevo tipo de variable, (una variable definida por el usuario) que servir de muestra para que en otra parte del programa le digamos, mediante una instruccin Dim, que tal variable es del tipo definido anteriormente mediante la instruccin Type. Por lo tanto, debemos declarar una variable en la parte que corresponda del programa, dependiendo del mbito que se le quiera dar a esa variable, diciendo que ser del tipo de la declarada mediante la instruccin Type. Usando la declaracin de Registro del ejemplo anterior, vamos a retomar el ejemplo de la biblioteca. Declararemos (posiblemente en la seccin de declaraciones del formulario) una variable que llamaremos p.e. REGLIBROS de la siguiente forma : Dim REGLIBROS as Registro A partir de este momento, el programa sabe que REGLIBROS es una variable que tiene 6 campos (Titulo, Autor, Editorial, Edicin, Precio y Existencias) y que cada campo tiene los caracteres especificados en la instruccin Type. Ahora nos cabe una pregunta Cuantos registros tiene un fichero Random? La respuesta es sencilla. Basta conocer la longitud del fichero mediante la instruccin LOF si el fichero ya est abierto, o con la instruccin FILELEN si no lo est, y dividir el dato obtenido con cualquiera de las dos instrucciones anteriores por el valor LongitudRegistro. Escribir datos en un fichero Random. Instruccin Put Una vez abierto el fichero Random podemos leer y escribir datos en l. Para escribir datos
Sistemas y Computacion LuisLu

182

Luis Lujan Avanzado utilizaremos la instruccin Put. La sintaxis de Put es la siguiente: Put # Numerocanal , NumeroRegistro, Variable

Visual Basic

Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se escribir ser el siguiente al ltimo registro escrito. NumeroRegistro es el nmero del registro que queremos escribir, y Variable es el contenido de ese registro. Siguiendo con nuestro ejemplo de biblioteca, Variable tiene en este caso el nombre REGLIBROS, que no es un String ni un Integer, sino una variable definida por el usuario ya que la declaramos con Dim REGLIBROS as Registro. Por lo tanto, la variable REGLIBROS contendr los mismos campos que habamos declarado para Registro en la instruccin Type. Recuerde :

Type Registro Titulo As String * 30 Autor As String * 30 Editorial As String * 15 Edicin As String * 6 Precio As String * 4 Existencias As String * 3 End Type

Asignamos 30 caracteres para el ttulo Otros 30 para el autor Asignamos 15 caracteres para editorial Asignamos 6 caracteres para Edicin Asignamos 4 caracteres para el precio Tres caracteres para existencias.

Luego REGLIBROS tendr 6 campos (Titulo, Autor, Editorial, Edicin, Precio y Existencias), cada uno de una longitud determinada, la definida en la instruccin Type. Antes de introducir REGLIBROS en el fichero habr que decir que valor tiene. Pero cada campo que lo compone tendr un valor. Podramos hacer una aplicacin en la que, a trav s de varios TextBox, le introdujsemos los valores de los campos, y el nmero de registro en el cual queremos escribir. El nombre de cada uno de los TextBox para cada uno de los datos es el siguiente : Campo Ttulo : TBTITULO Campo Autor : TBAUTOR Campo Editorial : TBEDITORIAL Campo Edicin :TBEDICION Campo Precio : TBPRECIO Campo Existencias : TBEXISTENCIAS La aplicacin deber introducir en cada campo el valor (string) existente en cada uno de esos TextBox. El valor de la variable REGLIBROS lo compondremos de la siguiente forma : REGLIBROS.Titulo = TBTITULO.Text REGLIBROS.Autor = TBAUTOR.Text REGLIBROS.Editorial = TBEDITORIAL.Text REGLIBROS.Edicion = TBEDICION.Text REGLIBROS.Precio = TBPRECIO.Text REGLIBROS.Existencias = TBEXISTENCIAS.Text (Si se hubiese omitido alguna de estas igualdades, el campo correspondiente contendra el valor nulo) De esta forma, REGLIBROS ya tiene un valor que se puede escribir en el fichero mediante la instruccin Put.

Sistemas y Computacion

LuisLu

183

Luis Lujan Avanzado El formulario de esa aplicacin tendr esta forma :

Visual Basic

Observe que ya se le han introducido otros controles (TextBox para introducir el nombre del fichero, otro para el nmero de registro, botones para leer, escribir, abrir el fichero (EXAMINAR), un par de botones para subir o bajar el nmero de registro y un botn para salir de la aplicacin. El TextBox para introducir el nombre del fichero se llama TBNOMBREFICHERO y en el que debemos introducir el nmero de registro a leer o escribir TBLEERESCR. El Botn EXAMINAR cierra cualquier fichero que pudiese estar abierto, abre el fichero indicado en TBNOMBREFICHERO, calcula el nmero de registros y escribe este nmero en el Label con nombre LNUMFICH. El cdigo de su procedimiento Click es el siguiente : Private Sub BEXAMINAR_Click() Close Cierra cualquier fichero abierto Open TBNOMBREFICHERO For Random As #1 Len = 88 Abre el fichero deseado LONGITUDFICH = LOF(1) Obtiene su longitud NUMREGS = LONGITUDFICH / 88 Calcula el N. de registros LNUMFICH.Caption = NUMREGS Pone ese N. en el Label End Sub Veamos como se escribe un registro. Analicemos el cdigo del procedimiento click del botn ESCRIBIR Private Sub BESCRIBIR_Click() REGISTROLIBRO.Titulo = TBTITULO.Text REGISTROLIBRO.Autor = TBAUTOR.Text variable REGISTROLIBRO.Editorial = TBEDITORIAL.Text REGISTROLIBRO.Edicin = TBEDICION.Text REGISTROLIBRO.Precio = TBPRECIO.Text REGISTROLIBRO.Existencias = TBEXISTENCIAS.Text Put #1, Val(TBLEERESCR), REGISTROLIBRO End Sub

Se asignan los valores de cada uno de los campos de la REGISTROLIBROS

Se escribe el registro

Observe que el N. de registro es el valor que figure en el TextBox TBLEERESCR Leer datos en un fichero Random. Instruccin Get
Sistemas y Computacion LuisLu

184

Luis Lujan Visual Basic Avanzado Para leer los datos de un fichero Random utilizaremos la instruccin Get. Su sintaxis es la siguiente : Get # Numerocanal , NumeroRegistro, Variable Puede omitirse NumeroRegistro. En este caso, el nmero de registro que se leer ser el siguiente al ltimo registro ledo. La Instruccin Get leer un registro completo. Ese registro contendr varios campos, y seguramente nos interesar conocer el valor de cada campo dentro de ese registro. Variable es una variable que contendr todos los campos. En nuestra aplicacin de biblioteca, Variable tiene por nombre REGISTROLIBRO (El mismo que tena para la instruccin Put de escribir. Es pura comodidad del programador. Puede tener cualquier otro nombre) Para obtener el contenido de cada campo, realizaremos un proceso similar al empleado para la escritura, pero al revs. En nuestra aplicacin, pretendemos poner el contenido de cada campo en los mismos TextBox que se utilizaron para escribirlos. Veamos el contenido del procedimiento click del botn LEER Private Sub BLEER_Click() Get #1, Val(TBLEERESCR), REGISTROLIBRO Lee el registro completo TBTITULO.Text = REGISTROLIBRO.Titulo Obtiene el valor del campo Titulo TBAUTOR.Text = REGISTROLIBRO.Autor Autor, Editorial, Edicin, Precio TBEDITORIAL.Text = REGISTROLIBRO.Editorial y Existencias y los pone en los TBEDICION.Text = REGISTROLIBRO.Edicin TextBox correspondientes a cada TBPRECIO.Text = REGISTROLIBRO.Precio dato TBEXISTENCIAS.Text = REGISTROLIBRO.Existencias End Sub Funciones e instrucciones aplicables a los ficheros Random. Funciones Seek y Loc. En los ficheros Random tienen especial importancia las funciones Seek y Loc. Mediante la Funcin Loc podemos conocer la el ltimo registro manipulado, bien por lectura, escritura. Si abrimos el fichero y no se ha hecho ninguna lectura o escritura de registros, el nmero devuelto por la funcin Loc es 0. La sintaxis de la funcin Loc es : Variable = Loc (Numerocanal) Variable tomar un valor igual al nmero del registro escrito o ledo por ltima vez. Mediante la Funcin Seek podemos conocer el prximo registro que ser manipulado en una operacin de lectura o escritura. Si abrimos el fichero y no se ha hecho an ninguna operacin de lectura o escritura, Seek devuelve el valor 1.

La sintaxis de la funcin Seek es : Variable = Seek (Numerocanal) ATENCION Seek puede ser una funcin (lee un Dato) o una instruccin (fuerza un dato) ! ! !
Sistemas y Computacion LuisLu

185

Luis Lujan Avanzado Instruccin Seek

Visual Basic

La instruccin Seek establece el prximo registro a leer o escribir en un fichero Random. Sintaxis Seek (Numerocanal), posicin posicin es el nmero de registro que se va a leer o escribir en la siguiente operacin. No acepta el 0 como nmero de registro, el mas bajo debe ser el 1. Si se intenta forzar a la posicin 0 dar un error. Funciones de los ficheros Random: EOF Devuelve un valor que indica si se ha llegado al final de un archivo. Sintaxis EOF(Numerocanal)

En archivos Random, EOF devuelve False hasta que se haya ejecutado una instruccin Get y no haya podido leer el registro completo, en cuyo caso devolver True. La funcin EOF no suele emplearse en ficheros Random, ya que en estos nos movemos a base de registros, y es muy fcil controlar cuantos registros existen en el fichero y en que registro nos encontramos o nos vamos a mover, mediante las funciones LOF, LOC y SEEK

LOF

( Lenght Of File ) Devuelve la longitud de un fichero . Sintaxis Variable = LOF(Numerocanal)

Mediante la funcin LOF podemos conocer el nmero de registros existentes en un fichero Random, dividiendo el valor devuelto por LOF por la longitud del registro declarada en la instruccin Open (LEN = longitud) N. Registros = LOF / longitud

Recuerde

Para obtener la longitud de un archivo que no est abierto utilce la funcin FileLen.

Sistemas y Computacion

LuisLu

186

Luis Lujan Avanzado FICHEROS BINARIOS

Visual Basic

Un fichero binario es una sucesin de bytes, uno tras otro, que puede almacenar cualquier tipo de informacin. Cuando se explicaban los ficheros secuenciales, decamos que eran los mas adecuados para introducir informacin de un texto, con los Random podamos realizar una base de datos de forma sencilla, a base de controlar los registros y sus campos. Con un fichero binario podemos almacenar cualquier informacin. (texto y cualquier tipo de datos) . Para abrir un fichero secuencial se abre utilizando la instruccin : Open Nombrefichero For Binary As # Numerocanal Como siempre en VB, Numerocanal puede ser un nmero comprendido entre 1 y 255, que define ea fichero. No pueden existir al mismo tiempo 2 ficheros abiertos con el mismo Numero de canal. Nombrefichero es el nombre completo del fichero, con su Path. Una vez abierto un fichero se binario, podemos leer o escribir datos en l. Para escribir uno o varios caracteres en un fichero binario, usaremos la instruccin Put. Put # Numerocanal, Posicin, Variable Donde Posicin es el Byte donde comenzar la escritura, y Variable es el nombre de la variable que contiene el dato a escribir. Este dato puede ser un byte o varios bytes. Para escribir varios bytes podemos hacerlo de dos formas : - Si se puede conocer de antemano el nmero de bytes a escribir, puede declararse Variable como un string de ese nmero de caracteres mediante la instruccin Dim, por ejemplo : Dim Variable As String * numero de bytes y en este caso siempre escribir el nmero de bytes declarado. Cuidado ! Si los datos a introducir sobrepasan el nmero de bytes declarados para Variable, los datos sobrantes no se escribirn en el fichero. Si los datos a escribir en el fichero fuesen menos que los declarados para Variable, la diferencia se rellenar con el byte nulo ( 0 ). - Si no se conoce de antemano el nmero de bytes a escribir, podemos declarar la variable sin especificar el nmero de bytes que tiene, y de esta forma se escribirn todos los bytes que componen la variable : Dim Variable As String Pero en este caso debemos volver a decir Cuidado !, si no conocemos el nmero de bytes que vamos a escribir, puede que machaquemos parte de la informacin que ya tenemos en el fichero, pues la instruccin Put va a colocar los bytes que componen Variable en la posicin especificada por Posicin y siguientes, hasta que quepa toda la cadena de bytes que le queremos introducir. Si la posicin en la que introducimos esos bytes es una posicin intermedia, y no controlamos bien el nmero de bytes a introducir y las informaciones que ya existen en el fichero en las posiciones colindantes con las que vamos a introducir los datos, es muy probable que perdamos esa informacin al introducir la nueva. Si se omite el dato Posicin, se tomar como byte de inicio de la escritura el siguiente al ltimo usado por la instruccin Put. Si quiere omitir este dato, debe conservar las comas que lo separan :
Sistemas y Computacion LuisLu

187

Luis Lujan Avanzado Put # Numerocanal, , Variable

Visual Basic

Qu pasar si el dato Posicin indica una posicin mayor que la que tiene realmente el fichero ? Simplemente que rellenar las posiciones intermedias que se formarn con un byte (puede verlo con el Block de Notas ) Un fichero binario es, como se deca al principio, una sucesin de bytes, que no tiene ningn tipo de separacin entre bytes. Cada dato (byte o conjunto de bytes) que introduzcamos en un fichero binario se escribir en el fichero tal y como se introducen. Machacando informacin ya existente si no se controla bien donde se mete. Por lo tanto, aunque parece que los ficheros binarios pueden ser mucho mas verstiles que los secuenciales y los Random, exigen mucho mas control que los anteriores. Limite el uso de este tipo de ficheros a las aplicaciones en que sea realmente imprescindible. Para leer datos de un fichero binario, utilizaremos la instruccin Get. Get # Numerocanal, Posicin, Variable Donde Posicin es el nmero del primer byte ledo, que como en el caso de Put, si se omite, tomar como valor el byte siguiente al usado en la ltima instruccin Get. Variable es el nombre de una variable que contendr los datos ledos. Pueden leerse uno o varios Bytes, pero ahora surge un pequeo problema. Como le decimos cuantos bytes debe leer ? Sencillamente los especificados al declarar la variable . Imaginemos que la declaracin de la v ariable fue : Dim Variable As String * 10 Con Variable declarada de esta forma, leer 10 bytes a partir del byte Posicin. (Incluido) De esta forma, siempre leeremos un nmero determinado de caracteres (10 en el caso del ejemplo). Esta es una limitacin para el uso de Get. Esta funcin viene muy bien en aquellas aplicaciones en las que tenemos que extraer un nmero fijo de bytes (En la prctica, en la mayor parte de las aplicaciones se extrae de uno en uno) Pero pueden existir aplicaciones en las que sea necesario leer una vez un nmero de caracteres, y otra vez otro. Ese problema lo tenemos resuelto con la instruccin Input. Podemos leer caracteres de un fichero secuencial mediante la instruccin Input : Variable = Input (Numero de bytes, # Numerocanal) Mediante la instruccin Input podemos leer el nmero de caracteres que queramos, pero no podemos controlar el byte de comienzo. Por lo tanto deberemos ayudarnos de la instruccin Seek para posicionar el puntero de lectura encima del primer byte que queramos leer : Seek (Numerocanal), Nmero del primer Byte a leer Por ejemplo, si queremos leer 35 bytes de un archivo binario, abierto con el nmero de canal 1, comenzando por el byte 48 (el 48 ser el primer byte ledo), ejecutaremos las dos siguientes instrucciones : Seek (1), 48 Variable = Input (35, #1) Variable contendr ahora los 35 bytes deseados.

Sistemas y Computacion

LuisLu

188

Luis Lujan Visual Basic Avanzado Al igual que se hizo para los ficheros secuenciales y Random, vamos a ver con un ejemplo prctico como se manejan los ficheros binarios. El formulario del ejemplo tiene esta forma :

Con el botn ABRIR se abre el fichero deseado. Si no existe en el disco, lo crea, ya que la instruccin Open Nombrefichero For Binary As # Numerocanal intenta abrir un fichero existente llamado Nombrefichero, y si este no existe, lo crea. Si existe el fichero, presenta todo su contenido en el TextBox inferior, para poder tener una referencia de que lugar ocupan los distintos caracteres (un fichero binario puede guardar cualquier byte, por lo que si abre un fichero generado con cualquier programa puede ser que muchos de los bytes no contengan informacin de un carcter, por lo que le recomendamos haga esta prctica con un fichero creado por la misma prctica) El botn CERRAR cierra el fichero. S ALIR sale de la aplicacin. El TextBox superior (variable) sirve para introducir la variable a escribir en el fichero, o para presentar la variable leda en caso de lectura . El TextBox posicin sirve para indicar la posicin del primer byte. Posicin por defecto presenta la posicin que se extrae mediante la funcin Seek cada vez que se hace una lectura o escritura en el fichero. Longitud de la variable permite introducir esa longitud, para leer mediante la instruccin Input. El botn ESCRIBIR escribe el dato Variable en el fichero, LEER (GET) lee un nico byte, y LEER (INPUT) lee una cadena de caracteres, de longitud la especificada en el TextBox Longitud de la variable. Se enumera a continuacin el cdigo de cada uno, dejando para las explicaciones del profesor en clase, o el estudio del alumno, la interpretacin de cada una de susu partes. FORMULARIO. DECLARACIONES Option Explicit Obliga a declarar todas las variables Dim LONGVAR As Integer Se declara la variable LONGVAR Dim COMIENZA As Long Se declara la variable COMIENZA Dim TESTO As String Se declara la variable TESTO Dim pospordef As Long Se declara la variable pospordef
Sistemas y Computacion LuisLu

189

Luis Lujan Avanzado

Visual Basic

BOTON ABRIR Private Sub BABRIR_Click() CD1.ShowOpen CD1 es un CommonDialog para buscar el fichero Open CD1.filename For Binary As #1 Abre el fichero indicado en CD1 TESTO = Input(LOF(1), #1) Lee de un golpe el fichero y lo mete en la variable TESTO TBFICHERO.Text = TESTO Presenta el fichero en el TextBox TBFICHERO End Sub BOTON CERRAR Private Sub BCERRAR_Click() Close End Sub BOTON ESCRIBIR Private Sub BESCRIBIR_Click() TBVAR2.BackColor = RGB(255, 0, 0) Dim escribe As String escribe = TBVAR1.Text Put #1, Val(TBVAR3), escribe byte pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub

La instruccin Close cierra todos los ficheros abiertos

Pone el TB long. De la variable en rojo Declara la variable escribe como string, sin limitacin Pasa el contenido de TBVAR a la variable escribe Instruccin Put. Val(TBVAR3) es la posicin del 1er Analiza donde qued el puntero del fichero y pone este valor en la etiqueta Lvar5

BOTON LEER (GET) Private Sub BLEER_Click() TBVAR2.BackColor = RGB(255, 0, 0) Pone en rojo el TB TBVAR2 (long. de la variable) TBVAR2.Text = "1" e indica que la longitud leda es 1 If Seek(1) >= LOF(1) Then Si est al final del archivo Seek #1, 1 pone el puntero en la posicin 1 End If Dim TEXTO As String * 1 Declara la variable TEXTO de un byte If TBVAR3.Text <> "" Then Si se le ha indicado donde tiene que comenzar COMIENZA = Val(TBVAR3.Text) le dice que comience en la posicin indicada en TBVAR3 ElseIf Lvar5.Caption <> "" Then si no, si existe posicin por defecto COMIENZA = Val(Lvar5.Caption) le indica que comience en la posicin por defecto Else si no COMIENZA = Seek(1) pone el puntero en la posicin 1 (byte 1) End If Get #1, COMIENZA, TEXTO lee un byte TBVAR1.Text = TEXTO y lo presenta en TBVAR1 pospordef = Seek(1) busca la nueva posicin por defecto Lvar5 = Str(pospordef) y pone ese valor en Lva r5 End Sub BOTON LEER (INPUT) Private Sub BLLERINPUT_Click() TBVAR2.BackColor = RGB(255, 255, 255) Pone TBVAR2 en blanco LONGVAR = Val(TBVAR2.Text) pasa el valor para long. de variable a LONGVAR If TBVAR3.Text <> "" Then si ese valor existe (TBVAR3 es distinto de nada) COMIENZA = Val(TBVAR3.Text) la variable COMIENZA toma ese valor Seek (1), COMIENZA coloca el puntero en ese valor End If Dim TEXTO As String Declara la variable TEXTO sin limitacin TEXTO = Input(LONGVAR, #1) Lee LONGVAR bytes del canal 1 y los pasa a TEXTO TBVAR1.Text = TEXTO y lo presenta en el TB TBVAR1
Sistemas y Computacion LuisLu

190

Luis Lujan Avanzado pospordef = Seek(1) Lvar5 = Str(pospordef) End Sub BOTON SALIR Private Sub BSALIR_Click() End End Sub

Visual Basic analiza la nueva posicin por defecto y la presenta en Lvar5

Sale de la aplicacin.

Private Sub TBVAR2_Change() TBVAR2.BackColor = RGB(255, 255, 255) en End Sub

Vuelve a color blanco si introducimos un dato este Text Box

FIN DE LA APLICACIN PARA MANEJO DE FICHEROS BINARIOS

Funciones y propiedades aplicables a todos los ficheros


DIR Devuelve el nombre de un archivo, directorio o carpeta que concuerda con el patrn o atributo de archivo especificado o la etiqueta de volumen de una unidad de disco. Sintaxis nombreruta devuelve atributos se Dir[(nombreruta[, atributos ])]

Expresin de cadena que especifica un nombre de archivo. Puede incluir el directorio o carpeta y la unidad de disco. Si no se encuentra nombreruta, Null. Constante o expresin numrica, cuya suma especifica atributos de archivo. Si omite, devuelve todos los archivos normales que satisfacen el nombreruta.

El argumento atributos tiene estas constantes y valores: Constante vbNormal vbHidden vbSystem vbVolume vbDirectory Valor 0 2 4 8 16 Descripcin Normal. Oculto. Sistema Etiqueta de volumen; si se especifica se ignoran todos los atributos Directorio o carpeta.

En Microsoft Windows, Dir permite el empleo de los caracteres comodn '*' (mltiples caracteres) y '?' (un solo carcter) para especificar varios archivos. La primera vez que se llama a la funcin Dir se debe especificar el nombreruta, de lo contrario se produce un error. Si adems se especifican atributos de archivo, se debe incluir el nombreruta. Dir devuelve el primer nombre de archivo que coincide con el nombreruta. Para obtener ms nombres de archivo que coincidan con el nombreruta, se debe volver a llamar a Dir sin argumentos. Cuando no hay ms nombres de archivo coincidentes, Dir devuelve una cadena de caracteres de longitud cero. Cuando se devuelve una cadena de longitud cero, en las siguientes llamadas se debe especificar nombreruta o se producir un error. Se puede cambiar el nombreruta sin haber obtenido todos los nombres de archivo que coinciden con el nombreruta actual. Sin embargo, no se puede llamar a la funcin Dir. FILECOPY
Sistemas y Computacion LuisLu

191

Luis Lujan Avanzado Copia un archivo. Sintaxis FileCopy fuente, destino

Visual Basic

fuente Expresin de cadena que especifica el nombre de un archivo a copiarse puede incluir el directorio o carpeta y la unidad de disco.. destino Expresin de cadena que especifica el nombre del archivo de destino se puede incluir el directorio o carpeta y la unidad de disco. Si intenta utilizar la instruccin FileCopy en un archivo abierto actualmente, se produce un error. FILEDATATIME Devuelve una fecha que indica la fecha y hora en que un archivo fue creado o modificado por ltima vez. Sintaxis Variable = FileDateTime(nombreRuta)

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo. Se puede incluir el directorio o carpeta y la unidad de disco. FILELEN Devuelve la longitud de un archivo en bytes. Sintaxis Variable = FileLen(nombreRuta) El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Si el archivo especificado est abierto cuando se llama la funcin FileLen, el valor devuelto representa el ltimo tamao de ese archivo cuando se guard la ultima vez en el disco. Para obtener la longitud de un archivo abierto, utilice la funcin LOF. GETATTR Devuelve un nmero, que representa los atributos de un archivo, directorio o carpeta o una etiqueta de volumen. Sintaxis Variable = GetAttr(nombreRuta)

El argumento con nombre nombreRuta es una expresin de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Valores devueltos El valor devuelto por GetAttr es la suma de los siguientes valores de atributos: Valor 0 1 2 4 16 32 Constante vbNormal vbReadOnly vbHidden vbSystem vbDirectory vbArchive Descripcin Normal. Slo lectura. Oculto. Archivo de sistema. Directorio o carpeta. El archivo ha sido modificado despus de efectuar la ltima copia de seguridad.
LuisLu

Sistemas y Computacion

192

Luis Lujan Avanzado SETATTR Establece los atributos de un archivo. Sintaxis nombreRuta atributos SetAttr nombreRuta;atributos

Visual Basic

Expresin de cadena que especifica un nombre de archivo se puede incluir el directorio o carpeta y la unidad de disco. Constante o expresin numrica cuya suma especifica los atributos de archivo.

Las constantes y valores de atributos son los mismos que para la instruccin GetAttr Si se trata de establecer los atributos de un archivo abierto, se producir un error en tiempo de ejecucin.

FREEFILE Devuelve el siguiente nmero de archivo disponible para ser usado con la instruccin Open. Sintaxis FreeFile[(nmerodeintervalo)]

El argumento nmerodeintervalo especifica el intervalo desde el que el siguiente nmero de archivo libre se va a devolver. Se especifica 0 (predeterminado) para devolver un nmero de archivo en el intervalo 1 a 255, inclusive. Se especifica 1 para devolver un nmero de archivo en el intervalo 256 a 511. Observaciones Se usa FreeFile cuando se necesita proveer un nmero de archivo y se quiere asegurar que el nmero de archivo no est ya en uso.

Sistemas y Computacion

LuisLu

193

S-ar putea să vă placă și