//examen 3: solución del alumno (2º variante): Con uso de estructuras y switch case (en pruebas)
// wcjsbsan.c
//
// Copyright 2011 julio
//
// Usando estructuras para los distintos casos de argumentos. y switch Case
#include <stdio.h>
#include <string.h> // manejamos cadenas (copiar, comparar)
// defino funciones....
void contar(int,int,int,char *);
// primer argumento es si cuento caracteres
// segundo argumento es si cuento palabras " ","\t","\n"
// tercero argumento es si cuento lineas "\n"
// cuarto argumento es el nombre del archivo
// crear estructura de opciones de argumentos y tareas a hacer....
typedef struct {
char nombre[15]; //14 caracteres (+1 de /0): adminteria -adfk y -a (por ejemplo)
int tarea; // un numero que especifique que tarea hara...
} tipoopciones;
int main(int argc, char **argv) {
// vemos los argumentos que nos han introducido....
int c=0; // contador
int d=0; //contador 2
int posicion_nombre_archivo=0; // guarda donde esta el archivo en los argumentos
// estas variables hacen una funcion de "interruptores"
int contarpalabra=0; // si vale 0 no las contará, si vale 1 contara palabras
int contarlinea=0;// si vale 0 no las contará, si vale 1 contara lineas
int contarcaracter=0; // si vale 0 no las contará, si vale 1 contara caracteres
int errores=0;//contar errores (introduccion de parametros no validos
while (c<argc) {
printf("Argumento nº %d, es el %s \n",c,argv[c]);
c++;
}
tipoopciones opcion[17]; //maximo numero de argumentos que nos va ha aceptar el programa
// reviso cada argumento, si la primera letra es un - (guion),
// se trata de un argumento a analizar, sino es el nombre del archivo a analizar...
// tabla de opciones posibles....
strcpy(opcion[0].nombre,"-w");
opcion[0].tarea=1; //contarpalabra=1
strcpy( opcion[1].nombre,"-l");
opcion[1].tarea=2; //contarlinea=1
strcpy( opcion[2].nombre,"-c");
opcion[2].tarea=3; //contarcaracter=1
strcpy(opcion[3].nombre,"-wl");
opcion[3].tarea=4;//contarpalabra=1 //contarlinea=1
strcpy( opcion[4].nombre,"-lw");
opcion[4].tarea=4;//contarpalabra=1 //contarlinea=1
strcpy(opcion[5].nombre,"--lines");
opcion[5].tarea=2; //contarlinea=1
strcpy(opcion[6].nombre,"--words");
opcion[6].tarea=1; //contarpalabra=1
strcpy(opcion[7].nombre,"-cw");
opcion[7].tarea=8; //contarpalabra=1 //contarcaracter=1
strcpy(opcion[8].nombre,"-wc");
opcion[8].tarea=8; //contarpalabra=1 //contarcaracter=1
strcpy(opcion[9].nombre,"-lc");
opcion[9].tarea=9; //contarlinea=1 //contarcaracter=1
strcpy(opcion[10].nombre,"-cl");
opcion[10].tarea=9; //contarlinea=1 //contarcaracter=1
strcpy(opcion[11].nombre,"-lwc");
opcion[11].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1
strcpy(opcion[12].nombre,"-wlc");
opcion[12].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1
strcpy(opcion[13].nombre,"-wcl");
opcion[13].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1
strcpy(opcion[14].nombre,"-cwl");
opcion[14].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1
strcpy(opcion[15].nombre,"-clw");
opcion[15].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1
strcpy(opcion [16].nombre,"-lcw");
opcion[16].tarea=10; //contarlinea=1 //contarcaracter=1 //contarpalabra=1
if (argc>20) {
fprintf(stderr, "%s: %d: El numero de argumentos a superado los 20 elementos \n", argv[0], argc);
errores++;
}
c=1;
// caso
while (c<argc) {
if (argv[c][0]=='-') {
// se trada de un argumento reviso la tabla....
d=0;
while (d<argc) {
//empiezo a comparar el argumento (c), con la lista de opciones que tengo
if ( strcmp(argv[c],opcion[d].nombre)==0) {
switch(opcion[d].tarea) {
case 1:
contarpalabra=1;
break;
case 2:
contarlinea=1;
break;
case 3:
contarcaracter=1;
break;
case 4:
contarpalabra=1 ;
contarlinea=1;
break;
case 8:
contarpalabra=1 ;
contarcaracter=1;
break;
case 9:
contarlinea=1 ;
contarcaracter=1;
break;
case 10:
contarlinea=1 ;
contarcaracter=1;
contarcaracter=1;
default:
// en caso contrario las combinaciones de letras no valdrían...
fprintf(stderr, "%s: %s: Opcion no valia\n", argv[0], argv[c]);
errores++;
}
}
d++;
}
} else {
//sera el nombre del archivo
if (argc>0) {
posicion_nombre_archivo=c;
break;
} else {
fprintf(stderr, "%s: %s: No se ha especificado nombre de archivo valido\n", argv[0], argv[0]);
}
}
c++;
}
if (errores!=0) {
return 1;
}
if (argc==2) {
//significa que solo ha escrio el comando y el nombre de archivo
//tenemos que ejecutar -w -l -c
contarpalabra=1;
contarlinea=1;
contarcaracter=1;
}
fprintf(stdout, "wcjsb contara del archivo: %s\n",argv[posicion_nombre_archivo]);
if (contarlinea==1) {
fprintf( stdout, "contara lineas\n");
}
if (contarpalabra==1) {
fprintf( stdout, "contara palabras\n");
}
if (contarcaracter==1) {
fprintf( stdout, "contara caracteres\n");
}
contar(contarcaracter,contarpalabra,contarlinea,argv[posicion_nombre_archivo]);
return 0;
}
void contar(int caracter,int palabra,int linea, char *archivo) {
int numero_caracter=0;
int numero_palabra=0;
int numero_linea=0 ;
FILE *pf;
char letra;
char letraAnterior;
int errores=0;
if((pf=fopen(archivo,"r"))==NULL) {
fprintf(stderr, "%s: %s: No se puede abrir el fichero\n", archivo, archivo);
errores++;
} else {
// Lee el primer caracter del archivo ¡porque es posible que el archivo este vacio!
letra = fgetc(pf);
letraAnterior = letra + 1; // asi nuestra letra anterior nos aseguramos que es distinta al anterior
//numero_caracter++;
// Mientras no sea fin de fichero
while(!feof(pf)) {
// tengo que analizar el caracter:
if (palabra==1) {
if ( ((letra==' ') || (letra=='\n') || (letra=='\t')) && (letra!=letraAnterior) ) {
// comprobramos que esta entre espacios y que no son espacios consecutivos (letra != letraAnterior)
numero_palabra++;
}
}
if (linea==1) {
if (letra=='\n') {
numero_linea++;
}
}
numero_caracter++;
letraAnterior = letra;
letra = fgetc(pf);
}
// Cierra el archivo
fclose(pf);
// escribe resultado segun lo que nos hayan pedido....
fprintf( stdout, "-------------Resultados-------------\n");
if (linea==1) {
fprintf( stdout, "Nº de lineas: %d\n",numero_linea);
}
if (palabra==1) {
fprintf( stdout, "Nº de palabras: %d\n",numero_palabra);
}
if (caracter==1) {
fprintf( stdout, "Nº de caracteres: %d\n",numero_caracter);
}
fprintf( stdout, "------------- fin -------------\n");
}
}
No hay comentarios:
Publicar un comentario