Herramientas de usuario

Herramientas del sitio


archivos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
archivos [2013/10/03 13:15] – [Archivos] lmateuarchivos [2019/09/03 13:53] (actual) – [Ejemplo: copia de archivos] lmateu
Línea 27: Línea 27:
 Devolver un caracter leído, para que se vuelva a leer. Devolver un caracter leído, para que se vuelva a leer.
   ungetc(c, in);   ungetc(c, in);
- 
-También se puede usar getchar y putchar para leer/escribir de la 
-entrada/salida estándar.  Pero estas son en realidad macros que 
-recurren a getc/putc. 
-  #define getchar()   getc(stdin) 
-  #define putchar(c)  putc((c), stdout) 
  
 Entrada/salida con formato: Entrada/salida con formato:
Línea 41: Línea 35:
 Lectura/escritura de bloques de bytes: Lectura/escritura de bloques de bytes:
   char buf[80];   char buf[80];
-  ssize_t leidos= fread(buf, 1, 80, in); +  size_t leidos= fread(buf, 1, 80, in); 
-  ssize_t escritos= fwrite(buf, 1, 80, out);+  size_t escritos= fwrite(buf, 1, 80, out);
  
 Determinar si se llegó al final del archivo: Determinar si se llegó al final del archivo:
Línea 56: Línea 50:
  
 Posiciona el archivo de tal forma que el próximo caracter que se leerá Posiciona el archivo de tal forma que el próximo caracter que se leerá
-de in es el que encuentra en desplazamiento pos, medido desde el comienzo+de in es el que encuentra en el desplazamiento pos, medido desde el comienzo
 del archivo. 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.  Además todos los archivos abiertos por un proceso se cierran automáticamente al terminar ese proceso.
 +
 +Es usual usar getchar y putchar para leer/escribir de la
 +entrada/salida estándar.  Pero estas son en realidad macros que
 +recurren a getc/putc:
 +
 +  #define getchar()   getc(stdin)
 +  #define putchar(c)  putc((c), stdout)
 +
 +Es decir una invocación a getchar() se substituye textualmente por getc(stdin).
 ==== Ejemplo: copia de archivos ==== ==== Ejemplo: copia de archivos ====
  
Línea 65: Línea 76:
   #include <stdio.h>   #include <stdio.h>
   #include <stdlib.h>   #include <stdlib.h>
-  +
   void filecopy(FILE *in, FILE *out) {   void filecopy(FILE *in, FILE *out) {
     char buf[1024];     char buf[1024];
 +    size_t size;
  
-    for (;;) { +    while ((size= fread(buf, 1, 1024, in))!=0) {
-      size_t size; +
-      if ((size= fread(buf, 1, 1024, in))==0)  +
-        break;+
       if (fwrite(buf, 1, size, out)!=size) {       if (fwrite(buf, 1, size, out)!=size) {
-        fprintf(stderr, "Error de escritura\n");+        perror("fwrite");
         exit(1);         exit(1);
       }       }
     }     }
     if (ferror(in)) {     if (ferror(in)) {
-      fprintf(stderr, "Error de lectura\n");+      perror("fread");
       exit(1);       exit(1);
     }     }
   }   }
-  + 
-  main(int argc, char *argv[]) {+  int main(int argc, char *argv[]) {
     FILE *in, *out;     FILE *in, *out;
- +
     if(argc!=3) {     if(argc!=3) {
       fprintf(stderr, "uso: %s <arch. fuente> <arch. destino>\n", argv[0]);       fprintf(stderr, "uso: %s <arch. fuente> <arch. destino>\n", argv[0]);
Línea 93: Línea 102:
     else {     else {
       if ((in= fopen(argv[1], "r"))==NULL) {       if ((in= fopen(argv[1], "r"))==NULL) {
-        fprintf(stderr, "No se puede leer '%s'\n", argv[1]);+        perror(argv[1]);
         exit(1);         exit(1);
       }       }
       if ((out= fopen(argv[2], "w"))==NULL) {       if ((out= fopen(argv[2], "w"))==NULL) {
-        fprintf(stderr, "No se puede escribir '%s'\n", argv[2]);+        perror(argv[2]);
         exit(1);         exit(1);
       }       }
Línea 104: Línea 113:
       fclose(out);       fclose(out);
     }     }
 +    return 0;
   }   }
 </code> </code>
 +
 +==== Ejercicio ====
 +
 +Estudie la [[http://users.dcc.uchile.cl/~lmateu/CC3301/download/filesort.zip|solución]] de la [[http://users.dcc.uchile.cl/~lmateu/CC3301/tareas/t2-2015-1.pdf|tarea 2 de 2015/1]].  Use el mismo enfoque de esa solución para resolver la pregunta 1 del [[http://users.dcc.uchile.cl/~lmateu/CC3301/controles/c2-151.pdf|control 2 de 2015/1]].  Pruebe su solución con el archivo [[http://users.dcc.uchile.cl/~lmateu/CC3301/download/buscar.zip|buscar.zip]].  Siga las instrucciones que se indican en el archivo Makefile.  Este ejercicio combina el uso de punteros a funciones con acceso directo a archivos por medio de fseek.
 +
archivos.1380806103.txt.gz · Última modificación: 2013/10/03 13:15 por lmateu