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