60
1 L.P.S.I L.P.S.I Entrada/Salida Introducción

1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

Embed Size (px)

Citation preview

Page 1: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

1L.P.S.IL.P.S.IEntrada/Salida

Introducción

Page 2: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

2

La biblioteca estándar de E/S

Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho, sino que se realizan mediante variables, funciones, macros y tipos (definidos en bibliotecas) cuyas implementaciones dependen del sistema.

Todos los sistemas proporcionan una serie de facilidades de E/S: la biblioteca estándar de E/S.

Para disponer de estas facilidades estándar es necesario que el fichero fuente en cuestión contenga la directiva:

#include <stdio.h>

Page 3: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

3L.P.S.IL.P.S.IEntrada/Salida

Flujos de datos (streams)

Las funciones de la biblioteca proporcionan una interfaz congruente con el sistema de E/S, independiente del dispositivo al que realmente se accede.

Una fuente o un destino de datos que puede asociarse a un disco u otro periférico - un dispositivo lógico - se denomina “flujo” (stream).

Las funciones de la biblioteca de E/S se encargan de establecer la comunicación necesaria con el sistema operativo para asociar el “flujo” al dispositivo físico.

Page 4: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

4L.P.S.IL.P.S.IEntrada/Salida

Flujos de texto & flujos binarios

Flujo de texto: secuencia de líneas compuestas por cero o más caracteres y terminadas por el carácter nueva línea (\n).

Si los dispositivos del sistema no utilizan esta representación, las funciones de la biblioteca hacen lo necesario para simularlo.

Flujo binario: secuencia de bytes que representan datos en el formato interno de la máquina; las funciones de la biblioteca no realizan ningún cambio de representación sobre este flujo.

En Unix, no hay ninguna diferencia entre estos dos tipos de flujo.

Page 5: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

5L.P.S.IL.P.S.IEntrada/Salida

Ficheros

Un flujo de datos se conecta a / deconecta de un fichero abriendo / cerrando el fichero desde el programa.

Si el sistema operativo trata los dispositivos de E/S como ficheros (p.e. Unix), se pueden enviar/recibir datos a/de cualquiera de ellos simplemente asociándolos a un flujo, como si se tratase de un fichero normal.

Page 6: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

6

Entrada / Salida

Estándar

Page 7: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

7L.P.S.IL.P.S.IEntrada/Salida

Los flujos stdin, stdout, stderr

Cuando comienza la ejecución de un programa, el sistema operativo abre tres flujos de texto:– stdin: entrada estándar,– stdout: salida estándar,– stderr: salida de errores estándar.

Los punteros de fichero (p.33) correspondientes se declaran en stdio.h.

Por omisión, estos flujos están conectados a la consola, pero pueden redirigirse a otros ficheros /dispositivos o “pipes”:

– en la línea de comandos, a la hora de invocar el programa– desde el programa, mediante una función de la biblioteca estándar

Page 8: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

8L.P.S.IL.P.S.IEntrada/Salida

Entrada por stdin: caracteres

int getchar(void)

– Devuelve el siguiente carácter de la entrada estándar como unsigned char convertido a int, o EOF en caso de alcanzar el fin de fichero o en caso de producirse algún error.

– Es necesario devolver un valor de tipo entero para poder utilizar un valor distinto al de cualquier carácter para EOF (End Of File). EOF es una macro que está definida en el fichero stdio.h (normalmente como -1).

– Cuando stdin está conectado al teclado: los caracteres tecleados se acumulan en el buffer de entrada y

la función no los lee hasta que se introduce un return el carácter leído también se envía a la salida estándar (esto es,

la función hace eco).

Page 9: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

9L.P.S.IL.P.S.IEntrada/Salida

Entrada por stdin: caracteres

int getche(void) int getch(void)

– Funciones alternativas a getchar definidas en el entorno Microsoft (es decir, no son de la biblioteca estándar) y declaradas en el fichero conio.h.

– Cuando stdin está conectado al teclado: los caracteres tecleados no se acumulan en el buffer de

entrada y las funciones los leen inmediatamente, la función getche hace eco y la función getch no.

Page 10: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

10L.P.S.IL.P.S.IEntrada/Salida

Salida por stdout: caracteres

int putchar(int car)

– Escribe el entero car, convertido a unsigned char, en la salida estándar y devuelve el carácter escrito (convertido a int) o EOF si se produce algún error.

– el parámetro formal es de tipo entero para poder utilizar como parámetro actual el valor devuelto por getchar().

Page 11: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

11L.P.S.IL.P.S.IEntrada/Salida

Entrada por stdin: líneas

char *gets(char *str)

– Lee caracteres de la entrada estándar hasta encontrar el carácter \n y los almacena en el array que comienza en la dirección pasada como parámetro.

– Reemplaza el \n final (nueva línea) por \0 (el carácter nulo).

– Devuelve la dirección str o NULL si se alcanza el fin de fichero o se produce algún error.

– Con esta función sólo se pueden leer cadenas de caracteres, ya que no realiza ninguna conversión de formato.

Page 12: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

12L.P.S.IL.P.S.IEntrada/Salida

Salida por stdout: líneas

int puts(const char *str)

– Escribe en la salida estándar los caracteres de la cadena que comienza en la dirección pasada como parámetro (esto es, hasta encontrar el carácter nulo \0).

– Reemplaza el \0 final por \n.

– Devuelve un valor no negativo si tiene éxito y EOF en caso contrario.

– Con esta función sólo se pueden escribir cadenas de caracteres, ya que no realiza ninguna conversión de formato.

Page 13: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

13

Entrada / Salida

Con Fomato

Page 14: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

14L.P.S.IL.P.S.IEntrada/Salida

E/S con formato por stdin/stdout

Para leer o escribir datos de un tipo que no sea char en un fichero de texto, es necesario realizar una conversión de la representación interna a una secuencia de caracteres o viceversa.

En el caso de la E/S estándar, esta conversión la proporcionan las funciones de la biblioteca estándar:– printf: para escribir datos formateados en la salida estándar– scanf: para leer datos formateados de la entrada estándar

Las conversiones se especifican mediante secuencias de caracteres que empiezan con el carácter % dentro de la denominada cadena de formato, primer argumento de estas funciones.

Page 15: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

15L.P.S.IL.P.S.IEntrada/Salida

Salida con formato por stdout: printf int printf(const char *cad_formato, ... )

– Escribe en la salida estándar los datos de la cadena de formato, llevando a cabo las conversiones de los datos proporcionados como argumentos especificadas en dicha cadena; devuelve el número de caracteres escritos o un número negativo en caso de error.

– En la cadena de formato pueden aparecer 2 tipos de caracteres: ordinarios: se copian directamente en la salida estándar, de especificación de conversión: provocan la conversión del

correspondiente argumento y su inserción en la salida estándar en la posición de esta especificación.

– El número y el tipo de los argumentos de la lista de argumentos deben coincidir con el número y el tipo de las conversiones especificadas en la cadena de formato (si no, resultados erróneos).

Page 16: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

16

Salida con formato:especificaciones de conversión

Estructura de una especificación de conversión para datos de salida:

% [banderas] [anchura] [. precisión] [mod] caracter_conversión

Esto es, entre el caracter % y el carácter de conversión opcionalmente pueden ir, en el siguiente orden, los indicadores:

– uno o varios caracteres especiales (las banderas),

– un número (la anchura de campo mínima),

– un punto seguido por un número (la precisión),

– uno de entre los caracteres h, l, L (el modificador de longitud).

Page 17: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

17L.P.S.IL.P.S.IEntrada/Salida

Salida con formato: banderas

indicador significado

- El argumento convertido se alineará a la izquierda del campo(es decir, los caracteres de relleno se insertarán a la derecha).

+ El valor numérico se escribirá siempre con signo (ANSI).

espacio Si el primer carácter no es un signo, se imprimirá primero unespacio (ANSI).

0 En una conversión numérica, como carácter de relleno seutilizará el cero en lugar del espacio (ANSI).

# Forma de salida alternativa (ANSI):- valores octales / hexadecimales se precederán de 0 / 0X,

- valores reales se escribirán siempre con el punto decimal,- ...

Page 18: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

18

Salida con formato:anchura de campo y precisión

número Anchura de campo mínima, que indica el número mínimode caracteres que se imprimirán; si el parámetro convertidotiene menos caracteres que los estipulados, se añadiráncaracteres de relleno (por omisión espacios a la izquierda).

. Separa la anchura mínima de la precisión.

número Precisión, que indica:

- para una cadena de caracteres: el número máximo de caracteres que se imprimirán,

- para un número real: el número de dígitos que se imprimirándespués del punto decimal - conversiones e, E o f - o elnúmero de dígitos significativos (ANSI) - conversiones g o G

-,

- para un entero: el número mínimo de dígitos; se añadirán0´s a la izquierda para rellenar el campo (ANSI).

Page 19: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

19

Salida con formato:modificador de longitud

h Indica que el argumento correspondiente se imprimirácomo un short o como un unsigned short (ANSI).

l Indica que el argumento correspondiente se imprimirá como un long o como un unsigned long.

L Indica que el argumento correspondiente se imprimirácomo un long double (ANSI).

Page 20: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

20L.P.S.IL.P.S.IEntrada/Salida

Salida con formato:caracteres de conversión

Carácter Tipo Conversión

d, i int Notación decimal con signo

u int Notación decimal sin signo.

o int Notación octal sin signo (por omisión, no precedido con 0).

x, X int Notación hexadecimal sin signo (por omisión, no precedido con 0x o 0X); usa abcdef / ADCDEF para 0x / 0X resp.

c int Carácter individual (después de convertirlo en unsigned).

Page 21: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

21L.P.S.IL.P.S.IEntrada/Salida

Salida con formato:caracteres de conversión

Carácter Tipo Conversión

e, E double Notación exponencial de la forma:[-] m.dddddde[+/-]xx o [-] m.ddddddE[+/-]xx

El número de dígitos de la parte fraccionaria viene determinado por la precisión (por omisión, 6 dígitos).

f double Notación en coma fija de la forma:[-] mmm.dddddd

El número de dígitos de la parte fraccionaria viene determinado por la precisión (por omisión, 6 dígitos).

g, G double Usa %e si el exponente es menor que -4 o mayor o igual

que la precisión, o %f en caso contrario (ANSI). No se escriben los ceros no significativos ni el punto decimal (si no hay parte fraccionaria).

Page 22: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

22Entrada/Salida

Salida con formato:caracteres de conversión

Carácter Tipo Conversión

s char * Se imprime la cadena de caracteres - hasta el siguiente \0, si no se ha especificado la precisión - que empieza en la

dirección proporcionada como argumento.

p void * Se imprime la dirección proporcionada como argumento en una representación que depende de la implementación.

n int * Se escribe el número de caracteres escritos hasta el momento en la dirección proporcionada como argumento; no tiene lugar ninguna conversión.

% - Se imprime el caracter %.

otro carácter Resultado indefinido.

Page 23: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

23L.P.S.IL.P.S.IEntrada/Salida

Salida con formato: ejemplo, printf

Ejemplo:

main() /* uso de indicadores con nos enteros y reales */ {

int i=123; float x=12.0, y=-3.3; printf(“:%6d %7.0f %10.1e:\n”, i, x, y); printf(“:%-6d %-7.0f %-10.1e:\n”, i, x, y); printf(“:%+6d %+7.0f %+10.1e:\n”, i, x, y); printf(“:%-+6d %-+7.0f %+10.1e:\n”, i, x, y); printf(“:%-6.0f %#7.0f %10.1g:\n”, x, x, y,);

}

Page 24: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

24L.P.S.IL.P.S.IEntrada/Salida

Salida con formato: ejemplo, printf

Salida en este ejemplo ( utilizamos ‘_’ para representar un espacio):

:___123 _____12 __-3.3e+00: se alinea a la derecha y se rellena con blancos por la izquierda

:123___ 12_____ -3.3e+00__: se alinea a la izquierda y se rellena con blancos por la derecha

:__+123 ____+12 __-3.3e+00: se alinea a la derecha pero con signo

:+123__ +12____ -3.3e+00__: se alinea a la izquierda pero con signo

:12____ ____12. ______-3.3:

Page 25: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

25L.P.S.IL.P.S.IEntrada/Salida

Entrada con formato por stdin: scanf int scanf(const char* cad_formato, ... )

– Escribe los valores leídos de la entrada estándar (E.E.) en las direcciones proporcionadas como argumentos, después de llevar a cabo las conversiones especificadas en la cadena de formato; devuelve el número de conversiones realizadas o EOF en caso de alcanzar el fin de fichero o en caso de error.

– En la cadena de formato pueden aparecer 3 tipos de caracteres: blancos (espacio, retorno, tab,...): sólo sirven de separadores, ordinarios: se descartará el mismo carácter leído de la E.E., de especificación de conversión: provocan la conversión de los

siguientes caracteres no blancos leídos de la E.E. y la escritura del valor obtenido en el argumento correspondiente (una dirección).

– La función finaliza cuando se agota la cadena de formato.

Page 26: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

26L.P.S.IL.P.S.IEntrada/Salida

Entrada con formato:especificaciones de conversión

Estructura de una especificación de conversión para datos de entrada:

% [*] [anchura_max] [modificador] caracter(es)_conversión

Esto es, entre el caracter % y el (los) caracter(es) de conversión, opcionalmente pueden ir, en el siguiente orden, los indicadores:

– un asterisco (el carácter de supresión de asignación),

– un número (la anchura de campo máxima)

– uno de entre los caracteres h, l, L (el modificador)

Page 27: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

27

Entrada con formato:*, anchura y modificador

Carácter de supresión de asignación: no se asignará el resultado de la conversión a ningún parámetro.

Anchura de campo máxima: el número máximo de caracteres que se convertirá para obtener el valor.

Modificador:

– los caracteres de conversión d, i, n, o, u, x pueden ir precedidos de una h si el correspondiente puntero apunta a un short (ANSI),

– los caracteres de conversión d, i, n, o, u, x, e, f, g pueden ir precedidos de una l si el correspondiente puntero apunta a un tipo modificado con long (long float <-> double) (i, n, u, ANSI),

– los caracteres de conversión e, f, g pueden ir precedidos de una L si el correspondiente puntero apunta a un long double (ANSI).

Page 28: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

28

Entrada con formato:caracteres de conversión

Carácter Datos de entrada; tipo de argumento

d Entero en notación decimal; int *.

i Entero que puede ser octal (si empieza con 0) o hexadecimal (si empieza con 0x o 0X); int *.

o Entero octal (empiece o no con 0); int *.

u Entero decimal sin signo; unsigned int *.

x Entero hexadecimal (empiece o no con 0x o 0X); int *.

p Dirección (valor de puntero) tal como imprime printf(“%p”); void *.

Page 29: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

29

Entrada con formato:caracteres de conversión

c Caracteres; el número de caracteres leídos viene determinado por la anchura de campo (por omisión, uno); no se añade el \0; no se saltan los caracteres blancos (si se quiere leer el próximo carácter no blanco, utilícese %1s); char *.

s Cadena de caracteres no blancos (no encerrados entre comillas). El argumento debe apuntar a un bloque de memoria reservada cuyo tamaño es lo suficientemente grande como para almacenar la cadena y el \0 que se añadirá; char *.

e, f, g Número en coma flotante; el formato de entrada utilizado es: signo opcional, una cadena de dígitos que posiblemente contenga el punto decimal, un exponente opcional compuesto por una e o una E seguido de un entero posiblemente con signo; float *.

Page 30: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

30

Entrada con formato:caracteres de conversión

n Se escribe el número de caracteres convertidos hasta el momento en la dirección proporcionada como argumento; no se lee ningún dato de entrada; el contador de conversiones no se incrementa; int *

[...] El dato esperado es una cadena cuyos componentes están incluidos en el conjunto de inspección ([…]); se saltan los blancos iniciales; se añade el \0; char *

[^...] El dato esperado es una cadena cuyos componentes no están incluidos en el conjunto de inspección ([…]); se saltan los blancos iniciales; se añade el \0; char *

% Carácter %; no se lleva a cabo ninguna asignación.

Page 31: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

31

Acceso a Ficheros

(funciones estándar)

Page 32: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

32L.P.S.IL.P.S.IEntrada/Salida

E/S por flujos arbitrarios:el buffer de E/S

Un flujo de datos se conecta a / desconecta de un fichero abriendo / cerrando el fichero desde el programa.

Hay dos mecanismos de acceso a ficheros:– acceso sin buffer: los datos se transfieren sin utilizar zonas de

almacenamiento intermedio,– acceso con buffer: los datos se transfieren utilizando zonas de

almacenamiento intermedio, mejorándose el tiempo de acceso a los datos al tener lugar menos accesos al fichero físico.

Por omisión, el mecanismo de acceso de las funciones de la biblioteca estándar usa un buffer de tamaño BUFSIZ, una macro definida en stdio.h. (se puede cambiar esta política mediante las funciones setvbuf y setbuf).

Page 33: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

33

E/S por flujos arbitrarios:puntero de fichero

Las funciones de la E/S no estándar (es decir, funciones que pueden enviar/recibir datos a través de un flujo que no sea stdin, stdout o stderr) de la biblioteca estándar manipulan los datos de un flujo mediante un puntero asociado (“puntero de fichero”).

Este puntero apunta a una estructura que contiene información sobre el fichero fuente o destino de los datos, tal como la localización de un buffer, la posición del cursor, si se ha abierto para lectura o escritura, si ha ocurrido algún error o si se ha alcanzado el fin del fichero.

FILE es un nombre de tipo definido en el fichero stdio.h como sinónimo (es decir, con typdef) del tipo que define esta estructura. Por tanto, se declara un puntero de fichero fp de la siguiente manera: FILE *fp;

Page 34: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

34

E/S por flujos arbitrarios:apertura de ficheros

FILE *fopen(const char *nombre, const char *modo)

– Abre el fichero cuyo nombre (con o sin vía de acceso) se pasa como primer parámetro con el modo de acceso especificado en el segundo parámetro y devuelve un flujo (~ puntero a FILE) o NULL si falla.

– Con el modo de acceso se especifica si el fichero se abre para: lectura : los datos se transfieren del fichero al programa, escritura : los datos se transfieren del programa al fichero, pudiéndose

borrar el contenido previo o añadirse a continuación de este, actualización: lectura y escritura sobre el mismo fichero. Entre una

lectura y una escritura debe llamarse a la función fflush() o a una función de posicionamiento del fichero.

Page 35: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

35

E/S por flujos arbitrarios: modos de acceso

El modo de acceso es una cadena de caracteres de la forma:” modo básico [ + ] [ b ] ”

donde modo básico es uno de entre r, w, y a, con los significados:r abrir fichero de texto para lectura; error si no existe. w abrir fichero de texto para escritura; si no existe se crea, si existe

se borra su contenido previo.a abrir fichero de texto para escribir al final; si no existe se crea.r+ abrir fichero de texto para actualización; error si no existe.w+ abrir fichero de texto para actualización; si no existe se crea, si

existe se borra su contenido previo.a+ abrir fich. de texto para actualización al final; si no existe se crea.

El carácter b al final de la cadena (p.e. ”rb” o ”w+b”), indica que se trata de un fichero binario (recordar: en Unix, no hay diferencia)

Page 36: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

36

E/S por flujos arbitrarios:cierre de ficheros

int fclose(FILE *flujo)

– Cierra el flujo de datos pasado como argumento (y que ha sido abierto mediante la función fopen).

– Si el fichero se abrió para lectura se descartan los datos pendientes del buffer de lectura.

– Si el fichero se abrió para escritura o actualización se escriben en el fichero los datos pendientes del buffer de escritura.

– Devuelve cero si no se ha producido ningún error y EOF en caso contrario.

Page 37: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

37

E/S por flujos arbitrarios:redirección de un flujo

FILE *freopen(const char *nombre, const char *modo, FILE *flujo)

– Abre el fichero nombre, con modo de acceso modo, y lo asocia al flujo (ya abierto) flujo.

– Devuelve flujo si no hay error y NULL en caso contrario

– Suele usarse para redireccionar los flujos estándar desde dentro del programa.

Page 38: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

38

Entrada por flujos arbitrarios:caracteres int getc(FILE *flujo) /* normalmente una macro

*/ int fgetc(FILE *flujo) /* función */

– Sirven para leer caracteres de un flujo abierto previamente con fopen.

– Devuelve el siguiente carácter del flujo flujo como unsigned char convertido a int, o EOF en caso de alcanzar el fin de fichero o en caso de producirse algún error.

– getchar() es equivalente a getc(stdin).

Page 39: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

39

Salida por flujos arbitrarios:caracteres

int putc(int car, FILE *flujo) /* macro */ int fputc(int car, FILE *flujo) /* función */

– Sirven para escribir caracteres en un flujo abierto previamente con fopen.

– Escribe el entero car, convertido a unsigned char, en el flujo flujo y devuelve el carácter escrito (convertido a int) o EOF si se produce algún error.

– putchar(car) es equivalente a putc(car, stdout).

Page 40: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

40

Entrada por flujos arbitrarios:líneas

char *fgets(char *str, int n, FILE *flujo)

– Sirve para leer cadenas de caracteres de un flujo abierto previamente con fopen.

– Lee hasta un máximo de n-1 caracteres del flujo flujo, parando si encuentra el carácter \n, y los almacena en el array que comienza en la dirección str.

– Añade el \0 al final del array (por tanto, se deben haber reservado n*sizeof(char) bytes); en caso de encontrar el \n, incluye este carácter en el array (a diferencia de gets).

– Devuelve la dirección str o NULL si se alcanza el fin de fichero o se produce algún error.

Page 41: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

41

Salida por flujos arbitrarios:líneas

int fputs(const char *str, FILE *flujo)

– Sirve para escribir cadenas de caracteres en un flujo abierto previamente con fopen.

– Escribe en el flujo flujo los caracteres de la cadena que comienza en la dirección pasada como parámetro (esto es, hasta encontrar el carácter nulo \0).

– La cadena str no contiene necesariamente el \n (y no se escribe el \0 en el flujo).

– Devuelve un valor no negativo si tiene éxito y EOF en caso contrario.

Page 42: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

42

E/S por flujos arbitrarios:E/S con formato

int fscanf(FILE *flujo, const char *formato,... )– Generalización de scanf que permite escribir datos

formateados en cualquier flujo, es decir,scanf(... ) es idéntica a fscanf(stdin,... ).

int fprintf(FILE *flujo, const char *formato,... )– Generalización de printf que permite leer datos formateados

de cualquier flujo, es decir,printf(... ) es idéntica a fprintf(stdout,... ).

Advertencia:– Las funciones de E/S directa son más eficientes.

Page 43: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

43

Entrada directa (sin formato)por flujos arbitrarios

size_t fread(void *pto, size_t tamaño, size_t nobjs, FILE *flujo)

– Lee del flujo flujo el número nobjs de objetos de tamaño tamaño y los almacena en las direcciones de memoria que siguen a la dirección apuntada por pto.

– Devuelve el número de objetos leídos, que puede ser menor que el pedido si se ha alcanzado EOF, o si se ha producido algún error.

– size_t está definido en stddef.h como un entero sin signo (exactamente cuál depende de la implementación).

Page 44: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

44

Salida directa (sin formato)por flujos arbitrarios

size_t fwrite(const void *pto, size_t tamaño, size_t nobjs, FILE *flujo)

– Escribe en el flujo flujo el número nobjs de objetos de tamaño tamaño que se encuentran almacenados en las direcciones de memoria que siguen a la dirección apuntada por pto.

– Devuelve el número de objetos escritos, que puede ser menor que el pedido en caso de error.

Page 45: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

45

E/S por flujos arbitrarios:vaciado del buffer de salida

int fflush(FILE *flujo)

– Sirve para descargar el contenido de un flujo de salida (efecto indefinido sobre un flujo de entrada); provoca que todos los datos pendientes en el buffer de escritura del flujo se escriban en el fichero/dispositivo destino.

– Devuelve EOF si se produce un error de escritura y cero en caso contrario.

Page 46: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

46

E/S por flujos arbitrarios:manipulación de ficheros

int remove(char *nombre)– Borra el fichero cuyo nombre se le pasa como parámetro,

devolviendo cero si no hay error y un valor distinto de cero en caso contrario.

int rename(const char *antiguo, const char *nuevo)– Cambia el nombre del fichero con nombre antiguo a nuevo, que

no debe coincidir con el nombre de otro fichero.– Devuelve cero si no ha habido error y un valor distinto de cero

en caso contrario.

Page 47: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

47

E/S por flujos arbitrarios:posicionamiento del cursor

int fseek(FILE *flujo, long desplazamiento, int origen)

– Posiciona el cursor (donde la siguiente lectura o escritura accederá a los datos), en flujo a desplazamiento bytes de origen. Devuelve cero si no hay error y un valor distinto de cero si lo hay.

– El valor de origen puede ser una de las siguientes macros (definidas en stdio.h):

SEEK_SET el principio del ficheroSEEK_CUR la posición actualSEEK_END el fin del fichero

– Para un fichero de texto, o bien desplazamiento es cero o bien desplazamiento es un valor devuelto por la función ftell y origen es SEEK_SET.

Page 48: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

48

E/S por flujos arbitrarios:posicionamiento del cursor

void rewind(FILE *flujo)– Posiciona el cursor al principio del fichero conectado a flujo.

rewind(f) <-> fseek(f,0L,SEEK_SET); clearerr(f)

long ftell(FILE *flujo)– Devuelve la posición actual del cursor (en bytes) en flujo, a

partir del comienzo de éste, y -1L si se produce algún error.– Si el fichero es de tipo texto el valor devuelto sólo sirve como

argumento de la función fseek.

Page 49: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

49

E/S por flujos arbitrarios:posicionamiento del cursor

int fgetpos(FILE *flujo, fpos_t *posición)– Almacena la posición actual del cursor en flujo en la variable

apuntada por posición, para su uso posterior por parte de la función fsetpos(). Devuelve cero si se produce un error y un valor distinto de cero en caso contrario.

int fsetpos(FILE *flujo, const fpos_t *posición)– Posiciona el cursor en el flujo flujo de acuerdo al valor de la

variable apuntada por posición. Este valor debe haberse obtenido mediante fgetpos(). Devuelve cero si se produce un error y un valor distinto de cero en caso contrario.

El tipo fpos_t es un tipo adecuado para almacenar posiciones en un flujo; se define en stdio.h.

Page 50: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

50

Tratamiento

de

Errores

Page 51: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

51

Tratamiento de errores: facilidades

Los mensajes producidos por errores de ejecución se escriben en el flujo estándar stderr.

La variable errno de tipo int, declarada en el fichero errno.h, contiene en todo momento el valor correspondiente al último error producido en la ejecución de alguna de las funciones de la biblioteca estándar.

En el fichero errno.h, se definen como macros los valores correspondientes a cada tipo de error.

Page 52: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

52

Tratamiento de errores: funciones

int feof(FILE *flujo)

– Devuelve un valor distinto de cero si está puesto el indicador de fin de fichero para el flujo flujo y cero en caso contrario.

– Se utiliza para detectar el fin del fichero con las funciones de E/S directa.

– También se puede utilizar para distinguir entre la ocurrencia de un error y el haber alcanzado realmente el fin de fichero con las funciones de E/S con formato, y con las de E/S de caracteres o de cadenas.

Page 53: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

53

Tratamiento de errores: funciones

int ferror(FILE *flujo)– Devuelve un valor distinto de cero si está puesto el indicador

de error para el flujo flujo (si se ha producido un error en la manipulación de este flujo) y cero en caso contrario.

void clearerr(FILE *flujo)– Esta función reinicializa los indicadores de fin de fichero

(véase la función feof) y de error para el flujo flujo.

void perror(const char *str)– Imprime en stderr la cadena str y un mensaje de error del

sistema correspondiente al valor actual de errno.

Page 54: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

54

Terminación

del programa

Page 55: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

55

Terminación del programa(funciones declaradas en stdlib.h)

void abort(void)– Da lugar a la terminación anormal del programa. Si se vacían

los buffers y se cierran los flujos abiertos depende de la implementación.

void exit(int estatus)– Da lugar a la terminación normal del programa, vaciándose

los buffers y cerrándose correctamente los flujos abiertos. Se devuelve el control al entorno del programa.

– El valor de estatus se pasa al sistema operativo (compárese con la sentencia return); la convención dicta que se devuelva cero para indicar que el programa ha terminado normalmente, y un valor distinto de cero en caso contrario.

Page 56: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

56

Acceso a ficheros

(funciones no estándar)

Page 57: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

57

E/S sin buffer en Unix

En Unix:– el mecanismo de acceso a ficheros de las llamadas a sistema

no usa buffer; el programador tiene la responsabilidad de proporcionar y mantener toda memoria intermedia necesaria,

– las funciones de la biblioteca estándar se implementan en términos de estas funciones de más bajo nivel,

– el descriptor de fichero (un entero no negativo) es el análogo del puntero de fichero del estándar ANSI.(equivalente MSDOS: manejador de fichero).

Otros sistemas pueden tener funciones de más bajo nivel parecidas a las de Unix, pero la manera en que se implementa la E/S sin buffer depende del sistema.

Los programas que utilicen estas funciones no serán portables.

Page 58: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

58

E/S sin buffer: apertura de ficheros int open(char *nombre, int banderas, int permisos)

– Abre el fichero existente nombre con modo modo y permisos permisos; devuelve un descriptor de fichero o -1 en caso de error.

– Los distintos banderas se definen como macros (en fcntl.h o sys/file.h o... ); banderas tiene que tener puesto uno de entre:

O_RDONLY Sólo lecturaO_WRONLY Sólo escrituraO_RDWR Lectura y escritura

posiblemente combinado mediante el operador | con otros, p.e.:O_APPEND Escritura al final del ficheroO_CREAT Si el fichero no exite, se crea

– En Unix, asociado a cada fichero hay 9 bits de información sobre permisos que controlan lectura, escritura y ejecución para el propietario, su grupo y el resto de usuarios Se suelen especificar mediante un número octal de 3 dígitos.

Page 59: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

59

E/S sin buffer:creación y cierre de ficheros

int creat(char *nombre, int permisos)– Crea un fichero nuevo con nombre nombre y permisos

permisos, si no existe; si existe, lo abre y borra su contenido.– equivalente a open con O_CREAT | O_WRONLY | O_TRUNC

int close(int fd)– Cierra el fichero asociado al descriptor fd devolviendo -1 si se

produce algún error y 0 en caso contrario.– El descriptor fd debe ser un descriptor válido.– Hay un límite en cuanto al número de ficheros que un programa

puede tener abiertos simultánemante; se deben cerrar los ficheros cuando ya no se necesiten.

Page 60: 1 L.P.S.IEntrada/Salida Introducción. 2 La biblioteca estándar de E/S l Las facilidades de Entrada/Salida no forman parte del lenguaje propiamente dicho,

60

E/S sin buffer:escritura / lectura de ficheros

int write(int fd, char *dest, unsigned tamaño)int read(int fd, char *origen, unsigned tamaño)

– Escribe en / lee de el fichero asociado al descriptor fd tamaño bytes de datos, almacenándolos en / leyéndolos de el array que empieza en la dirección dest / origen.

– Devuelve el número de caracteres escritos / leídos o -1 en el caso de que se produzca algún error. La función read devuelve 0 si se alcanza el fin del fichero.