User Tools

Site Tools


Writing /var/lib/dokuwiki/data/meta/teaching/ie0117/actividad_funciones_recursion.meta failed
teaching:ie0117:actividad_funciones_recursion

This is an old revision of the document!


Funciones, recursión, entrada, salida y funciones de sistema

Funciones que podrían ser utilizadas en esta actividad

fopen, fclose, fgetc, fprintf, fputc, fread, fwrite, stat, fscanf

Instrucciones

Programa Examinador de directorios

  • Cree un árbol de archivos de la siguiente forma en su directorio home:
root_dir
root_dir/d1
root_dir/d1/e1.txt
root_dir/d1/e2.bak
root_dir/d1/e3.bal
root_dir/d1/dd1/e4.bak
root_dir/d1/dd1/e5.txt
root_dir/d2/e6.bal
root_dir/d2/e7.txt
root_dir/d2/dd2/e8.bak
root_dir/d2/dd2/e9.txt
root_dir/e10.txt
root_dir/e11.bak
  • Ejecute ls -Ral root_dir. Copie el resultado de este comando en un archivo e inclúyalo en el informe de esta actividad.
  • A cada archivo e?.??? ingrese como su contenido interno “Este archivo se llama: ” seguido de el mismo nombre del archivo.
  • Construya un programa que abra el archivo root_dir/d1/e1.txt y muestre su contenido en pantalla. Agregue este programa al informe.
  • Modifique el programa anterior para que lea el contenido de root_dir/d1/e1.txt, lo copie en un nuevo archivo llamado root_dir/result y además agregue una línea que diga: “el directorio actual es: root_dir/d1” (el directorio actual realmente, debe ser extraído del nombre completo del archivo leído). Agregue este programa al informe.
  • Utilizando los programas anteriores y recursión, construya un programa que examine todo el árbol de archivos de arriba y copie la lista de archivos (con su directorio) de todos los archivos terminados en .txt en pantalla y en el archivo “root_dir/result”. Agregue este programa al informe. (opcional 20%)

Algunas funciones de ayuda

Estas funciones pueden contener errores y estar incompletas (no se chequean errores). Usted es responsable de corregirlas o completarlas.

int get_len(char *data) {
  int len=0;
  while(data[len]!='\0'){
    len++;
  }
  return(len);
}
char * get_dir(char *filename) {
  char *output;
  output=calloc(256, sizeof(char));
  int last_dir_pos=0;
  int i;
  for (i=0; i<256; i++) {
    if (filename[i]=='/') {
      last_dir_pos=i;
    } else {
      if (filename[i]=='\0') {
  break;
      } else {
  if (filename[i]=='\n') {
    break;
  }
      }
    }
  }
  if ((i==256) || (last_dir_pos==0)) {
    output[0]='\0';
  } else {
    for (i=0; i<last_dir_pos; i++) {
      output[i]=filename[i];
    }
  }
  return(output);
}
void mystrcpy(char *dataout, char *datain) {
  int i=0;
  char c;
  while ((c=datain[i])!='\0') {
    dataout[i]=c;
    i++;
  }
  dataout[i]='\n';
  dataout[++i]='\0';
}
char *grow_str(char *old, char sep, char *new) {
  int old_total_size=get_len(old);
  printf("Grow str old len %d, new len %d\n", old_total_size, (get_len(old)+get_len(new)+2));
  char *output=realloc(old, sizeof(char)*(get_len(old)+get_len(new)+2));
  output[old_total_size]=sep;
  mystrcpy(output+old_total_size+1, new);
  output[old_total_size+get_len(new)+1]='\0';
  return(output);
}
bool is_txt(char *filename) {
  int len;
  len=get_len(filename);
  if ((filename[len-1]=='t') && (filename[len-2]=='x') && (filename[len-3]=='t')){
    return(true);
  } else {
    return(false);
  }
}
bool is_dir(char *filename) {
  struct stat mystat;
  printf("Is dir? %s\n", filename);
  if (stat(filename, &mystat)!=0) {
    printf("Error %d\n", errno);
    printf("%s\n", strerror(errno));
    exit(0);
  }
  mode_t mymode;
  mymode=mystat.st_mode;
  if (S_ISDIR(mymode)) {
    return(true);
    } else {
    return(false);
  }
}
teaching/ie0117/actividad_funciones_recursion.1475752335.txt.gz · Last modified: 2022/09/20 00:08 (external edit)