archivos
Diferencias
Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
archivos [2012/08/22 21:50] – creado lmateu | archivos [2019/09/03 13:53] (actual) – [Ejemplo: copia de archivos] lmateu | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
===== Archivos ===== | ===== Archivos ===== | ||
+ | |||
+ | Todas la funciones de acceso a archivos requieren incluir: | ||
+ | |||
+ | #include < | ||
+ | |||
+ | Para operar con archivos se requiere declarar un puntero a un descriptor de archivo: | ||
+ | |||
+ | FILE *in, *out; /* file pointer */ | ||
+ | |||
+ | Antes de leer o escribir hay que abrir el archivo. | ||
+ | entrada estándar, salida estándar y salida estándar de errores que ya están abiertos. | ||
+ | |||
+ | in= fopen(nombre, | ||
+ | out= fopen(nombre, | ||
+ | /* fopen retorna NULL en caso de error */ | ||
+ | |||
+ | Después de leer o escribir se debe cerrar el archivo para liberar recursos y para | ||
+ | asegurar que se escriba todo el contenido de un archivo de salida. | ||
+ | algunos bytes podrían permanecer en buffers internos. | ||
+ | fclose(out); | ||
+ | |||
+ | Leer/ | ||
+ | c= getc(in); | ||
+ | putc(c, out); | ||
+ | |||
+ | Devolver un caracter leído, para que se vuelva a leer. | ||
+ | ungetc(c, in); | ||
+ | |||
+ | Entrada/ | ||
+ | |||
+ | fprintf(fp, formato, ...); | ||
+ | fscanf(fp, formato, ...); | ||
+ | |||
+ | Lectura/ | ||
+ | char buf[80]; | ||
+ | size_t leidos= fread(buf, 1, 80, in); | ||
+ | size_t escritos= fwrite(buf, 1, 80, out); | ||
+ | |||
+ | Determinar si se llegó al final del archivo: | ||
+ | if (feof(in)) | ||
+ | ... | ||
+ | |||
+ | Determinar si ocurrió algún error de lectura/ | ||
+ | if (ferror(out)) | ||
+ | ... | ||
+ | |||
+ | Acceso directo: | ||
+ | fseek(in, pos, SEEKSET); | ||
+ | |||
+ | Posiciona el archivo de tal forma que el próximo caracter que se leerá | ||
+ | de in es el que encuentra en el desplazamiento pos, medido desde el comienzo | ||
+ | del archivo. | ||
+ | |||
+ | ==== Entrada estándar, salida estándar y salida estándar de errores ==== | ||
+ | |||
+ | Todo proceso al partir cuenta con los siguientes descriptores de archivos para leer la entrada estándar, escribir la salida estándar o escribir en la salida estándar de errores respectivamente: | ||
+ | |||
+ | FILE *stdin, *stdout, *stderr; | ||
+ | |||
+ | No es necesario abrir estos archivos porque se abren automáticamente al iniciarse el proceso. | ||
+ | |||
+ | Es usual usar getchar y putchar para leer/ | ||
+ | entrada/ | ||
+ | recurren a getc/putc: | ||
+ | |||
+ | #define getchar() | ||
+ | #define putchar(c) | ||
+ | |||
+ | Es decir una invocación a getchar() se substituye textualmente por getc(stdin). | ||
+ | ==== Ejemplo: copia de archivos ==== | ||
+ | |||
+ | El siguiente programa copia un archivo: | ||
+ | | ||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | void filecopy(FILE *in, FILE *out) { | ||
+ | char buf[1024]; | ||
+ | size_t size; | ||
+ | |||
+ | while ((size= fread(buf, 1, 1024, in))!=0) { | ||
+ | if (fwrite(buf, | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | } | ||
+ | if (ferror(in)) { | ||
+ | perror(" | ||
+ | exit(1); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int main(int argc, char *argv[]) { | ||
+ | FILE *in, *out; | ||
+ | |||
+ | if(argc!=3) { | ||
+ | fprintf(stderr, | ||
+ | exit(1); | ||
+ | } | ||
+ | else { | ||
+ | if ((in= fopen(argv[1], | ||
+ | perror(argv[1]); | ||
+ | exit(1); | ||
+ | } | ||
+ | if ((out= fopen(argv[2], | ||
+ | perror(argv[2]); | ||
+ | exit(1); | ||
+ | } | ||
+ | filecopy(in, | ||
+ | fclose(in); | ||
+ | fclose(out); | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Ejercicio ==== | ||
+ | |||
+ | Estudie la [[http:// | ||
+ |
archivos.1345672207.txt.gz · Última modificación: 2012/08/22 21:50 por lmateu