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 [2012/08/23 02:10] 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, 80, 1, in); +  size_t leidos= fread(buf, 1, 80, in); 
-  ssize_t escritos= fwrite(buf, 80, 1, 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 52: Línea 46:
     ...     ...
  
 +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.  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 59: 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;     size_t size;
-         + 
-    while (!feof(in)) { +    while ((size= fread(buf, 1, 1024, in))!=0) { 
-      size_t size= fread(buf, 1024, 1, in)+      if (fwrite(buf, 1, size, out)!=size) { 
-      if (ferror(in)) { +        perror("fwrite");
-        fprintf(stderr, "Error de lectura\n"); +
-        exit(1); +
-      } +
-      if (fwrite(buf, size, 1, out)!=size) { +
-        fprintf(stderr, "Error de escritura\n");+
         exit(1);         exit(1);
       }       }
 +    }
 +    if (ferror(in)) {
 +      perror("fread");
 +      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 86: 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(2);+        exit(1);
       }       }
       filecopy(in, out);       filecopy(in, out);
Línea 97: 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.1345687844.txt.gz · Última modificación: 2012/08/23 02:10 por lmateu