You are on page 1of 16

Transparencias de Archivos - # 1

n e jo d e A R e H I V
Ma oS en e
Sistemas de E/S en e

<e>, no posee la capacidad de realizar operaciones de E/S en si

rnismo. Debe valerse de las libreras de funciones que acompaan al

. compilador que se este utilizando. Existen dos puntos, de visa o

tratamiento de los archivos en e:

1. Sistema de E/S ANSI (sistema de archivos con buffer)


o Utiliza punteros a estructuras de tipo FILE y el
concepto de corrientes de informacin. (alto nivel)
2. Sistema de E/S tipo UNx (sistema de archivos sin buffer)
o Utiliza descriptores de tipo int y tambin corriente$. (Bajo nivel)

Flujoso Corrientes de informacin


* El sistema de E/S de e suministra al programador una interface
independiente det drspositivo al que se esta accediendo: El flujo o
corriente de informacin (a partir de aqu, corriente).
* Proporc.ona de este modo, un n.vel de abstracc.n entre e~
programador y el dispositivo que se esta usando.
* A la abstraccin se la denomina corriente; al dispositivo real,. se lo
llama archivo.
* En el sistema de E/S de ANSI e, un archivo es un concepto lgico
que puede ser aplicado a cualqurer cosa (archivo de drsco, teclado,
MODEM, impresora, etc.)
* Las corrientes, entonces, son una fuente o destino de datos que
pueden estar asociadas a un disco u otro perifrico.
* Como las corrientes son independientes y se comportan siempre del
mismo modo, una misma funcin puede atender un archivo de disco
o la consola.
* Sin embargo, NO TODOS los archivos tienen las mismas
posibitidades: los archivos- de disco permiten acceso directo
(posicionamiento) y uno de consola no, por ende TODAS las
corrientes son IGUALES. pero NO TODOS los archivos lo son.
Transparencias de Archivos - # ~}'
,.".. .
.Corrientes de texto o binarios
* La corriente de texto es una secuencia de bytes que representan
caracteres ASCII y que estan agrupados.
* La corriente binaria es un secuencia de bytes.
(es una cuestin de interpretacin)

Corrientes Predefinidas (de texto)

Perifrico.
Corriente
Archivo
consola -- teclado stdin
I
standard input

consola - monitor stdout .


standard output

errores del sistema stderr


standard error .

puerto auxiliar stdaux


standard auxilia_ry_

Impresora stdprn
standard printer

Manejadores?: Puntero FILE (FILE pointer)


* Al abrir una corriente, la funcin de apertura nos devuelve un
puntero a una estructura que identifica a esa corriente
unvocamente (FILE Pointer). Esa estructura es un "nuevo tipo"
denominado FILE.
* A que apunta? ... A un bloque de memoria que contiene toda
la informacin inherente a la corriente cuyo formato se
encuentra definido en stdio.h.
* Cmo se accede a esa estructura? .... Como a cualquier otra
estructura, a travs del operador l.
Sin embargo, para manejar
archivos, no se requiere conocerla internamente. Es
transparente para el programador. La usan las funciones de
manejo de corrientes vinculndose a travs del File Pointer.
_* Ls variables de este tipo, se declaran del mismo modo que el
,.. ', .

resto. Por ejemplo: FILE * pepe; (donde la variable pepe queda


definida ' como un puntero de tipo FI LE, o FI LE pointer), que
hasta el momento se encuentra DESCONTROLADO.
* Se requieren tantos "Files Pointers", como corrientes se deseen abrir.
* Cumplen el lgebra de punteros PERO NO tiene sentido pensar
en su uso.

,E/S con buffer (ANSI)


.. Se leen y escriben bloques de datos desde y hacia un dispositivo
externo usando como intermediario una zona de memoria llamada buffer
.. Provee una rpida bufferizacin automtica.
.. Al usar "buffer", los accesos son ms veloces, puesto que es ms
rpido acceder a memoria que a cualquier otro medio de
almacenamiento.
.. Un elemento clave bajo este mecanismo es la forma en que los
archivos son abiertos. Adems de la operacin de apertura:
~ Se genera en memoria un array de caracteres externo que
har las veces de buffer.
~ Se genera, tambin en memoria, una estructura de control de
, tipo FILE que contiene informacin acerca del buffer y del
archivo y que se encuentra definida en stdio.h

Modos de apertura genricos '


, '

Modo de Efecto sobre el archivo que


Accin ,
apertura se abre
r Lectura no cambia
w ' Escritura I~ ,se ~ierde 'lo -.9ue haba
a , Escritura ,seac'gre-.9a lo nuevo al
final
r+ lectura/escritura modifica '
w+ escritura/lectura . 'se,pierd lo que haba
a+ , escritu rallectu ra s agrega Jo nuevo al final

'-
.. _ u
. ' , . , : :
_ _..... __ .. ~ ~" t
I
... , _
,"'
.. I -_
nclude : stdio.h _ .,
','
lt
Transparencias de Archivcrs - # 4t
-----------------------------~--
1* stdio.h Definitions for stream inputloutpUt. *1
I-~------------------~---------------~----l
: 1* _ null.h : Definition of NULL. *1 .:
I I
. I
: #ifndef NULL l

#ifndef NULL ///: : # ifdefinedLTINY~ 11 defi~edLSMALL~11 . i


. I
. I d <
# Inc II h>// -~ definedLMEDIUM~
U e _nu. "" _, # . define NULL O

#endif ",,: I # eJse

" I
:# define NULL OL . :
1#
I
endif I
I
L _________________________________________ ~
I #endif I

#define BUFSIZE 512 /* tamao del buffer para corrientes*/


... ......
~-------------------------------
/* End-of-file constant definition */

#define EOF (-1) . /* End of file indicator */


- - - - - - - - - - - - - - - - - - - - - -. - - - - - - - - -
J* Number ()ffiles that can be opensimultaneously*l

... ...
...
...... . . . .. .

1#define FOPEN MAX20 /* Able tohave 20 files perprocess*J .


#define SYS_OPEN 20 1* Able to have 20 fUes for system*/

j* Definition of the control structure for streams *j

typedef struct {

int level; 1* fill/empty level of buffer */

.......
unsigned ~~:~. fl ags; ....:::- 1* File status flags */
..
0 11 11 11 11 11 11

char ........ fd, 1* File descriptor */


unsigne9thar hold; J* Ungetc char if no buffer */
nt :./ bsize; 1* Buffer size */
unsigrfed char *buffer; 1* Data transfer buffer */
u nsi g ~ed char *curp ; 1* Current active pointer */
unsign~d istemp; 1* Temporary file indicator */
short token; 1* Used for validity checking */
} ... ...... FILE; 1* This is t he FILE object */
...... ...
Mantiene informacin importante sobre la corriente que se actualiza

dinmicamente. oor eiemolo:

Transparencias de Archivos - # 5

* SreS deRD, WR RDIWR * Si se alcanz el final de archivo


* Si hubo error en la ultima * Si los datos estanentrando
operacin. saliendQ
* Si .es binario de texto * Si es archivo de disco oNO..

/* "flags" bits definitions*/

(mascaras "pre-definidas" para chequear el estado de el miembro "flags")

#define OxOO03
#define
- FF- RDWR
READ OxOOOl
/* Read/write flag
Read only file
*/
/* */
#define
#define
- FF- WRIT OxOO02
BUF OxOO04
/*
/*
Write only file
Malloc'ed Buffer data
*/
*/
#define F LBUF oxoooa /* line-buffered file */
#define FERR Ox0010 /* Error indicator */

#define _F_ OF Ox0020 1* EOF in cator * I

(=> un "1" en el bit 5 de fp->flags indica el EOF)

#define F BIN Ox0040 /* Binary file indicator */

#define F IN oxooao /* Data is incoming */

. #define F OUT Ox0100 /* Data 1S outgoing */

#define F TERM Ox0200 /* File is a terminal */

Descripcin del resto de los campos de la estructura tipo FILE


Buffer Es la direccin de comienzo del buffer.
Bsize Tamao del buffer. Queda determinado por la constante BUFSIZE (512).
Es un entero de 8 bits que sirve para ligar la corriente con el
Fd archivo fsico. Es el offset en la tabla de archivos abiertos que
maneja el S.O.
Puntero a la posicin actual dentro del buffer. Cada vez que se rea-
liza una transferencia, curp incrementa su valor automticamente en
Curp
una cantidad igual a los bytes transferidos. Cuando alcanza el valor
bufter+BUFSIZE, pasa a valer nuevamente buffer.
Indica la cantidad de bytes que restan para llegar al final del buffer o al
final del archivo. Cuando vale 0, fuerza el volcado de los datos al disco
Level (si se tratara de una operacin de escritura) y recupera
automticamente su valor BUFSIZE a menos que se haya ledo por
com_pleto el archivo.
Istemp Se utiliza en el caso de apertura de archivos temporales con la funcin tmpfileO.
Token Se puede utilizar para la implementacin de un sistma de cheJlueo de errores.
Hold Es un byte "temporal" , relacionado con e.! uso de la funcin ungetc(}
Transparencias de Archiv6s - # q. ,
;... " .
1* Constants to be used as 3rd argument for "fseek" function ~/

#define SEEK CUR 1 0

. # define SEEK END 2 '

#define SEEK SET .O

1* Sta.n dard IIOpredefined streams */ . _. _. _. _. _. _. _. _._ . _. _. _. _. _. _. _. .,


I .
,., ." _. _. - . _.. i Variable global predefinida I
#define
.
stdi,n . (&_streams[O])
. .
o ~ conlO array de tipo FILE I
L._._._ . _._._._._._._._._._._ . _._ .
#definestdout (&_streams[1])

#define stderr .(&_streams[2])

. ,;
,;,;
. ,;,;
,;

#define stdaux (&~streams[3])

#define stdprn (&_streams[4])

----~~---~---~-----------~-----~
/* The following macros provide for common functions */ .

#define getchar() getc(stdin)

#define putchar(c) putCC), stdout)

Transparencias de Archivos - # 7
.; , \..

Poseen Buffer intermedio.

Antes de escribir sobre el perifrico, los datos se guardan en un buffer.

Prototipo:
FILE * fopen (canst"fhar * path , canst char * made);
" I---------------------~--~
path : path + nombre + ext~si - - - - Las variables de cualquier tipo :

modificadas con la palabra clave :

mode: modo de apertura :. "const", NO pueden ser :

alteradas durante la ejecucin :


Retorno: :L- _______ del prognlina.
~~
.
_____________ .2I
xito: puntero a FILE (FILE* a la corriente).
Error: NULL

Ejemplo: FILE * fp;


fp = fopen ("c:\\temp\\archi.txt","r+");

Prototipo: int fclose (FILE * fp );


fp: Es el puntero obtenido a travs de la funcin fopen( ... ).
Retorno:
xito: O
Error: EOF
Ejemplo: fclose (fp);

Ejemplo de aplicacin (i)


Simplemente, crearemos un archivo y lo cerraremos sin guardar
nodo.
TransparenCias de Archivcrs - # 8~ o

Verificaremos su existencia por medio del explorador de arcnvos.


[OPENCLOO.C] \
,
Jodos de Apertura
Tal como se indic, la variable global predefinida en fcntl.h fmode,
amanece con el valor O_TEXT,
modo Retorno I Efecto sobre
Accin Tipo
O TEXT A B e e/ archivo
R Lectura texto fp : NULL NULL .. no cambia
W Escritura texto f
fp I .p NULL se.pierde .
.
A
,
Escritura texto fp fp NULL se agrega
R+ lctura/escritura .. .texto fp NULL NULL . modifica
W+ escritu raltectu ra texto ' fp fp NULL , se pierde
A+ escriturallectura texto fp fp , . NULl .,. seagrega
rb lectura binario fp NULL . NULL no cambia
wb Escritura . binario fp fp NULL se pierde '
ab . Escritura , binario fp_ fp NULL se agrega
rb+ lectura/escritu ra binario fp NULL ' NULL .modifica
wb+ escriturallectura binario Fp fp NULL . se pierde
ab+ escriturallectura binario Fp fp NULL se agrega
Si modo fuera O_BINARY, para realizar la apertura de corrientes en modo
texto se deber agregar t con el mismo sentido que se hizo con b.
Retorno: A - xito B - El archivo no existe e -Error de acceso
A VANeE (INTRODUCC/ON) SOBRE ARGUMENTOS DE LA FUNC/ON MA/N.

En 'arg1' recibo el N de argumentos .

r
Lo veremos
:ngresados por la lnea de cOlnandos +1 ms adelante
(?) main ( nt argl , char *arg2[], char *arg3[])
arg2 es un puntero a puntero a charo Seala el inicio de un vector de
punteros a char de dimensin argl ' . Cada posicin del vector apunta a una
string que se corresponde con los argumentos ingresados.
Si por ejemplo ejecutramos lo siguiente: "C:\>miJrg -t 12" ... obtendramos...
r .exe " ~es cadena)
ar 2 1 ="-t" (es una cadena

.
Transparencias de Archivos - # 9

Ejemplo de aplicacin (ii)


Idem Anterior, solo que mandaremos los argumentos de fopen() a travs de la
lnea de comandos [OPENCLO I.C]

Prototipo:
int fgetc (FI LE * stream ); o int getc (FI LE * stream );

stream : Es el puntero obtenido a travs de la funcin fopen( ... ).

R.~torno:
xito: carcter ledo (en un int)
Error o fin de Archivo: EOF

Ejemplos: fgetc(fp); getc(stdin);

Prrototipo:
int fputc (int e , FILE * stream);
int putc (int e , FI LE * stream );

e: caracter a escribir.

st eam : Es el puntero obtenido a travs de la funcin fop.en( ... ).

Retorno:
xito: carcter escrito ( c )
Error: EOF
Ejemplos: fputc ('A' ,stdout); putc (c,fp);

Ejemplo de aplicacin (iii)


Lectura de un archivo existente y envio de la corriente a stdout (se utiliza
argumentos del main) [OPENCL02.C]
Ejemplo de aplicacin (iv)

. .
Transparencias de ArchivoS" - # 1Q'I,
.

Funcin: rewind

Prototipo: void rewind (FILE * stream );


stream : Es el puntero obtenido a travs de la funcin fopen( ... ).
Ejemplo: rewind(fp);

Funcin: fseek

Prototipo: int fseek (FILE * fp1 , long offset, nt fromwhere );


fp1 : Es el puntero obtenido a travs de la funcin fopen( ... ) .
.offset: Desplazamiento en bytes.
fromwhere: Desde donde se realiza el desplazamiento.
SEEK_SET (O) - desde el principio
SEEK_CUR (1) - desde la actual posicin del cursor
SEEK_END (2) - desde el final
Retorno:
xito:
Error: <>
Ejemplo:
fseek(fp1,O,SEEK_SET);
1* idntico a realizar rewind(fp1 )*/

Funcil : ft 11

Ac;;lnj~Jnd1CiiTh1posicion actual del cursor en una corriente.

Prototipo: long ftell (FILE * stream );


stream : Es el puntero obtenido a travs de la funcin fopen( ... ).
Retorno:
xito: posicin en bytes desde el origen.
Error: -1
Ejemplo: len = ftell (stream);
. .
Transparencias de Archivos - # 11

Macro: feof

Prototipo: nt feof (FILE * a);


a: Es el puntero obtenido a travs de la funcin fopen( ... ).
Retorno: Ejemplo: while (!feof (a
fin de archivo: distinto de O
posicin intermedia: O
Ejemplo de aplicacin (v)
Se 'abre 'un archivo en binario y se muestra su contenido de varias maneras.
Usamos: getc(), putc(), rewind(), feof(), fprintf() ..... [EOF.C]

Ejemplo de aplicacin (vi)


Idem anterior, pero analizando el contenido de la estructura FILE ..... [EOF 1.C]

Modo Texto Modo Binario


ARCHIVO ARCHIVO
1 byte .. 1 ASCII 1 byte .. 1 byte
Fin de Fin de
archivo
.. Ctrl+Z archivo no posee
~ o '\n' o .
Ox10
111
'CR' +' LF' 'CR' 'CR'
La diferencia radica en c om o se INTERPRE TAN l os datos
I MPO RT AN T E: L o s d atos so n siempre b i na r ios
nclude : fcntl.h
Tiene definidos todos los flags (#defines) relacionados con
"corrientes" y la variable global _fmode (responsable de definir el
modo de acceso a la corriente).
,. ; ,. ----------------------------------------------------------------
~xtern int _fmode;
#define O_TEXT Ox4000 /* CR-LF translation */
Transparencias de Archivos - # 12,!t ~
t .
#define O_BINARY Ox8000 /* no translation */
....
....
.... ....
....
....--------------------------------------------------------- ------- .

extern int _fmode /* adopta el valor 0_TEXT O_BINARY */

0_TEXT : modo texto (valor por defecto de _fmode)


O BINARY: modo binario

Porqu existe esta complicacin?

Sencillo, el Lenguaje C no naci "arriba" del D.O.S.

En C, un cambio de lnea se representa con '\n' (caracter ASCII 'LF'),

sin embargo bajo D.O.S., lo mismo se representa con 2 caracteres:

'CR' (OxOD) + 'LF' (OxOA)

Por ello, y de manera transparente al usuario, dada una corriente


abierta EN MODO TEXTO las funciones de librera dedicadas al
manejo de E/S, realizan una transformacin cuando se enva el
caracter "cambio de lnea" a un archivo y una antitransformacin,
cuando se lo recupera.
Si la corriente fue abierta EN MODO BINARIO, estas transforma
ciones no ocurren.

Ejemplo de aplicacin (vii)


Anlisis de varias operaciones realizadas sobre un archivo, observando el

contenido de los campos de la estructura FILE correspondiente (MUY

INTERESANTE!!!)

Usamos: fprintf(), fputc(), rewind(), ftel/(), feof(), fgets(), etc. [FILETEST.C]

.
.
.

Funcin: ~ ets ..

Prototipo: char* fgets (char* str, int n ,FILE * stream );


str: buffer de destino.
n: Cantidad nlxima de bytes a leer - 1.

stream : Es el puntero obtenido a travs de la funcin fopen(... ).

Retorno:
xito: str

Error o fin de Archivo: NULL

Ejemplos: fgets (str , 80 , fp);


fgets (str , 80 , stdin);

Nota: fgets detiene la lectura cuando lee n-1 caracteres o al encontrar el


carcter '\n', que en caso de encontrar guarda en el buffer, para
luego agregar el carcter nulo ('\0') al final del string.

Funcin: 'tJ uts

Prototipo: int fputs (char* str ,FILE * stream );

str: buffer origen (string a guardar).

stream : Es el puntero obtenido a travs de la funcin fopen( ... ).

Retorno:
xito: ltimo carcter escrito

Error: EOF

Ejemplos: fputs (str, fp);


Nota: No se agrega el caracter de CR ('\n').
No se escribe el caracter nulo ('\0').
Ejemplo de aplicacin (viii)
Ejemplo de aplicacin bsico. [fputfget.C]
Transparencias de Archivo~ - #.f4 ~ ~

uncin: fseanf

Prototipo:
size_t fscanf (FILE * stream, constchar* control , vari ables ... );

stream : Es el puntero obtenido a travs de la funcin fopen( ... ).

control : Cadena de control.

variables: Lista de variables de destino.

Retorno:
xito: n-Cantidad de campos ledos, convertidos y guardados.
Fin de Archivo: EOF.

Ejemplos: fscanf (fp , "O/od-%d-%ld" ,&a,&b,&lx);


fscanf (stdin , "O/os" ,str); .

. Prototipo:
size_t fprintf (FILE * stream,const char* control , variables ... );
. stream : Es el puntero obtenido a travs de la funcin fopen( ... ).
control : Cadena de control.
variables: Lista de variables origen.
Retorno:

xito: n-Cantidad de bytes escritos.

Error: EOF.

Ejemplos: fprintf (fp , "%d-%d-%ld",&a,&b,&lx);

fprintf (stdout , "Nombre: %s",str);

Ejemplo de aplicacin (ix) Eien1plo de aplicacin (x)


Ejemplo de aplicacin bsico. [fprintf.c] Ejemplo de aplicacin bsico. [fscanf.c]
Ejemplo de aplicacin (xi)
Escribe cadenas en un archivo de disco /lomado "fprintf. yo" yen stdout. Observar el
diferente comportamiento del archivo cuando se lo abre como "w" y como ''wb"
{fornttl.c 1
. \
. Ejemplo de aplicacin (xii)
Transparencias de Archivos - # 15

Lectura de una cte de texto desde un archivo llamado "autoexec.bak" usando


fscanf() y mostrndolo en la pantalla con printf(). Observar que como toda la fija
de scanf(), los espacios, tabs, y \n encontrados en el lirastre o de caracteres segn
11

su cadena de control, esconsiderado como el fin del campo a leer. [fscanf l.c]

Prototipo: ... __ ..
size_t fread (void* buf,(~ize_(~sz , size_t n ,FILE * fp );
---, .

buf: buffer de destino, (donde deja'l-e informacin).


'~r --------------
sz: tamao de cada bloque. 11" . . :
11 .
n: Cantidad de bloques a leer. Il ..... ___. .
.... _____ .... ___ _1

fp : Es el puntero obtenido a travs de fopen( ... ).


Retorno:
xito: n-Cantidad de bloques ledos.
Error o fin de Archivo: valor < n (posiblemente O).
Ejemplo: fread (buff , sizeof (mi_struct), 1 ,fp);

Funcin: fi rite

Prototipo:
size_t fwrite (void* buf, size_t 5Z , size_t n ,FILE * fp );
buf: buffer de origen, (bloques a almacenar).
sz: tamao de cada bloque.
n: Cantidad de bloques a escribir.

fp: Es el puntero obtenido a travs de fopen( ... ).

Retorno:
xito: n-Cantidad de bloques escritos.
Error: valor < n (posiblemente O).
Transparencias de Archivos' - # 16~"

Ejemplo: fwrite (buff , sizeof (mi_struct), 1 , fp);

Ejemplo de aplicacin (xii) Ejemplo de aplicacin (xiii)


Ejemplo de aplicacin bsico. [fwrite.c] Ejemplo de aplicacin bsico. [fread.c]

Funcin: fflush
Accin: Vuel~o forza<to de datos. ( del buffer al dispositivo) .
Prototipo: nt fflush (FILE * stream );
stream : Es el puntero obtenido a travs de la funcin fopen( ... ).
Retorno: xito: O.
Error: EOF.

Ejemplo de aplicacin (xiv)

Ejercitamos con caracteres de control, el \n, el CTRL.-Z, etc.

Usamos: fgetc(), fputc(), fgets(), fputs(), fprintf(),feof(), rewind(), fseek(), fwrite()

y fread() [CR_LF _26.C]

Ejemplo de aplicacin (xv)


Me permite abrir un archivo como cte. binaria y agregarle un caracter en la
posicin que deseo, para luego volver a verlo pero como texto. Tanto el
nombre (+path) como la posicin dentro del archivo en donde vaya escribir,
as como tambin el valor del byte a escribir vienen por la lnea de comando.
[ADD_BINA.C]

Ejemplo de aplicacin (xvi)


Prueba de ftell - fseek - rewind.
Utilizamos esas funciones sobre el archivo fwrite. txt, creado con el prg fwrite.c .
.. , [ftelsek.e]

Ejemplo de aplicacin (xvii)


Abriendo una corriente de TEXTO, creo un archivo cuyo nombre viene
por la LdeC. Primero, le ingreso caracteres desde la stdin, luego le "fuerzo" 3
"\n", para finalmente utilizar fprintf() y fwrite() ... [Varios l.e]

,. Ejem~lo de a~licacin (xviii)


skow bCfla ,c = .kv~?t_r;? ~ () ISto.?n'<) ~l c.o rn. (" OLe (.
l d u !le... d da. LO .tA" .?fl 0..0S.

You might also like