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!
Table of Contents
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
- 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.1475751873.txt.gz · Last modified: 2022/09/20 00:08 (external edit)