pdf, 62K - Departamento de Informática

Anuncio
Departamento de Informática
Taller de Sistemas Operativos
Universidad Técnica Federico Santa María
Biblioteca de E/S Estándar
E/S no formateada y formateada.
1
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Características
• Especificada por el estándar de ANSI-C
(sirve para diferentes Sistemas Operativos).
• Maneja buffers y optimización de E/S
transparente para el usuario
• Facilita programación de E/S
Raúl Monge
IV-2
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Streams y Objetos FILE
• Al abrir un archivo se asocia un stream que
es manipulado por el objeto FILE (handle).
• Contiene información como:
– descriptor de archivo
– Punteros al buffer
– Tamaño del buffer
– Bytes actualmente en el buffer
– Registro de estado (e.g. errores)
Raúl Monge
IV-3
1
Departamento de Informática
Taller de Sistemas Operativos
Universidad Técnica Federico Santa María
Streams Estándares
• Para todo proceso existen automáticamente
los siguientes objetos FILE* :
– stdin: Entrada Estándar
– stdout : Salida Estándar
– stderr : Error Estándar
• Cada uno de ellos referencia al descriptor de
archivos correspondiente
Raúl Monge
IV-4
Departamento de Informática
Taller de Sistemas Operativos
Universidad Técnica Federico Santa María
Buffering
• Reduce el número de llamadas a read y write.
• Simplifica la interfaz del usuario (es realizado
automáticamente).
• Tipos de buffering:
– Completo: Usado típicamente para archivos de disco
– Línea: Se realiza E/s con nueva línea, usada para
terminales.
– Sin buffering: se usa con caracteres (e.g. Se usa en el
stream de error).
Raúl Monge
IV-5
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Funciones: fopen, freopen y fdopen
#include <stdio.h>
FILE* fopen(const char *pathname, const char *type );
FILE* fropen(const char *pathname, const char *type, FILE *fp );
FILE* fdopen(int fildes, const char *type);
return: puntero al archivo si OK, NULL si existe error
• fopen abre el archivo indicado
• freopen abre un archivo en un stream específico,
cerrando primero al que apunta.
• fdopen asocia un stream a un archivo abierto
Raúl Monge
IV-6
2
Departamento de Informática
Taller de Sistemas Operativos
Universidad Técnica Federico Santa María
Tipos de Apertura
r o rb
apertura para lectura
w o wb
apertura para escritura
a o ab
r+ o r+b o rb+
apertura para escribir al final o
crear para escribir
apertura para lectura y escritura
w+ o w+b o wb+
trunca a 0 para lectura y escritura
a+ o a+b o ab+
abre o crea para lectura y escritura
al final del archivo
(no existe control de acceso)
Raúl Monge
IV-7
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Función: fflush
#include <stdio.h>
int fflush(FILE* fp);
return: 0 si OK, EOF si existe error
• Causa que datos no escritos por el stream se pasen
al kernel.
• Nótese que no garantiza que se escriba
directamente al dispositivo (lo hace snc o fsync)
Raúl Monge
IV-8
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Función: fclose
#include <stdio.h>
int fclose(FILE* fp);
return: 0 si OK, EOF si existe error
• Cierra el archivo asociado al stream
• Todos los datos de salida en el buffer son vaciado
previamente
• Datos de lectura en el buffer son descartados.
• Se libera la memoria asociada al buffer
• Término normal de un proceso (main o exit) cierra
automáticamente todos los streams.
Raúl Monge
IV-9
3
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Lectura/Escritura no Formateada
• Tres tipos de E/S:
– Un caracter por vez (e.g. getc y putc)
– Una línea por vez (e.g. fgets y fputs)
– E/S directa (e.g. fread y fwrite)
Raúl Monge
IV-10
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Funciones de Entrada por Caracter
#include <stdio.h>
int getc(FILE* fp);
int fgetc(FILE* fp);
int getchar();
return: próximo caracter si OK, EOF si existe error o EOF
int ungetc(int c, FILE* fp);
return: c si OK, EOF si existe error
• getchar() equivale a getchar(stdin)
• getc puede ser una macro, pero fgetc tiene garantía
de ser una función.
• ungetc devuelve el caracter al buffer
Raúl Monge
IV-11
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Discriminación entre EOF y Error
#include <stdio.h>
int ferror(FILE* fp);
int feof(FILE* fp);
return: no cero (verdadero) si OK, 0 (falso) si existe error
void clearerr(FILE* fp);
• ferror permite ver si ocurrió error
• feof si se está en EOF
• clererr limpia los flags
Raúl Monge
IV-12
4
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Funciones de Salida por Caracter
#include <stdio.h>
int putc(int c, FILE* fp);
int fputc(int c, FILE* fp);
int putchar(int c);
return: caracter c si OK, EOF si existe error
• Similar a la entrada por caracter
Raúl Monge
IV-13
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Funciones de Entrada por Línea
#include <stdio.h>
int fgets(char* buf, int n, FILE* fp);
int gets(char* buf);
return: buf si OK, NULL si existe error o EOF
• fgets lee hasta n-1 caracteres al buffer, incluido
nueva línea, siendo terminado con byte 0.
• gets lee de stdin, pero tiene el problema que no
especifica tamaño del buffer. Por tal razón no es
recomendable su uso.
Raúl Monge
IV-14
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Funciones de Salida por Línea
#include <stdio.h>
int fputs(const char * str, FILE* fp);
int puts(const char* str);
return: valor no negativo si OK, EOF si existe error
• Similar a la entrada por línea
• Carácter terminal 0 no se escribe a la salida
Raúl Monge
IV-15
5
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Entrada y Salida Binaria
#include <stdio.h>
size_t fread(void* ptr, size_t size, size_t nobj, FILE* fp);
size_t fwrite(const void* ptr, size_t size, size_t nobj, FILE* fp);
return: número de objetos leídos o escritos
•
•
•
•
size describe el tamaño de la estructura
nobj describe el número de objetos
ptr es el buffer del usuario
Facilita la escritura o lectura de arreglos de datos
Raúl Monge
IV-16
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Posición en el Stream
#include <stdio.h>
long ftell(FILE* fp);
return: posición actual si OK, -1L si existe error
int fseek(FILE* fp, long offset, int whence);
return: 0 si OK, no cero si error
void rewind(FILE* fp);
• ftell y fseek permiten obtener y modificar posición
del cursor (han sido reemplazadas por fgetpos y
fsetpos de ANSI-C).
• rewind vuelve el cursor a comienzo de archivo.
Raúl Monge
IV-17
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Posición en el Stream
#include <stdio.h>
int fgetpos(FILE* fp, fpos_t * pos);
long fsetpos(FILE* fp, const fpos _t * pos);
return: 0 si OK, no cero si existe error
• Similar a lo anterior, pero tipo fpos_t permite
largos arbitrarios de archivos.
Raúl Monge
IV-18
6
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Salida Formateada
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE* fp, const char *format, ...);
int sprintf(char* buf, const char *format, ...);
return: número de caracteres almacenados en el arreglo
• Funciones formateadas con uso de múltiples
variables.
Raúl Monge
IV-19
Departamento de Informática
Universidad Técnica Federico Santa María
Taller de Sistemas Operativos
Entrada Formateada
#include <stdio.h>
int scanf(const char *forma t, ...);
int fscanf(FILE* fp, const char *format, ...);
int scanf(const char * buf, const char *format, ...);
return: # items de entrada asignados si OK, EOF si error o EOF
• Funciones formateadas con uso de múltiples
variables.
Raúl Monge
IV-20
7
Descargar