elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda ejercicio C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda ejercicio C  (Leído 3,431 veces)
alexlopez91

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Ayuda ejercicio C
« en: 6 Junio 2011, 20:44 pm »

Hola a todos.

Tengo este ejercicio que se debe ejecutar desde la linea de comandos y que se le pasan los siguientes parametros:
        -c Cuenta el nº de caracteres del fichero
   -l Cuenta el nº de líneas del fichero
        -p Cuenta el nº de palabras, donde una palabra

La sintaxis a la hora de abrirlo por la linea de comandos es la siguiente: Cuenta Nombre_Fichero [-c][-l][-p]

He hecho el siguiente codigo, pero a la hora de abrirlo nunca me hace nada.
¿Alguien sabe que ocurre?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ESPACIO ' '
#define TAB '\t'
#define INTRO '\n'

void MostrarAyuda();
void cuenta_caracteres();
void cuenta_lineas();
void cuenta_palabras();

main(int argc, char *argv[])
{
         FILE *f;
         
         if((f=fopen("fichero.txt","r"))==NULL)
         {
         printf("No se puede abrir el fichero");
         system("pause");
         exit (0);
         }
         
         if(strcmp(argv[1],"c")==0)
         cuenta_caracteres();
         
         if(strcmp(argv[1],"l")==0)
         cuenta_lineas();
         
         if(strcmp(argv[1],"p")==0)
         cuenta_palabras;
         
         if(argc<2)
         MostrarAyuda();
         
         system("pause");
}

void MostrarAyuda()
{
     printf("\n-c: Cuenta el numero de caracteres del fichero\n");
     printf("\n-l: Cuenta el numero de lineas del fichero\n");
     printf("\n-p: Cuenta el numero de palabras del fichero\n");
}

void cuenta_caracteres()
{
     FILE *f;
     char car;
     int i=0;
     
     while(car!=EOF)
     {
     car=fgetc(f);
     i++;
     }
     
     printf("\n\nLos caracteres totales son %d\n",i-1);
}

void cuenta_palabras()
{
     FILE *f;
     char car;
     int palabra=0;
     
     while(car!=EOF)
     {
     if(car==ESPACIO || car==TAB || car==INTRO)
     palabra++;
     }
     
     printf("\n\nEl archivo contiene %d palabras\n",palabra+1);
}

void cuenta_lineas()
{
     FILE *f;
     char car;
     int linea=0;
     
     while(car!=EOF)
     {
     printf("%c",car);
     car=fgetc(f);
     if(car=='\n')
     linea++;
     }
     
     printf("\n\nEl archivo contiene %d lineas\n",linea);
}


En línea

Gunit

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Ayuda ejercicio C
« Respuesta #1 en: 6 Junio 2011, 21:02 pm »

Si yo escribo Cuenta -c el argv[1] es igual a "-c" por lo que deberías cambiar el IF y agregarle el menos :

Código
  1. if(strcmp(argv[1],"-c")==0)

Deduzco que usas windows por lo de system("pause"), yo lo probe en Linux, no se si es lo mismo.


En línea

alexlopez91

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Ayuda ejercicio C
« Respuesta #2 en: 6 Junio 2011, 21:35 pm »

Acabo de probar lo de escribir -c en el codigo, pero a la hora de ejecutarlo desde la linea de comandos da un error y no hace nada. A ti te funciono en Linux?
En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Ayuda ejercicio C
« Respuesta #3 en: 7 Junio 2011, 00:37 am »

Fijate que en cada función a la que llamas estás declarando de nuevo una variable FILE, y luego la intentas usar sin tan siquiera abrir el fichero , que tal si se lo pasas como parámetro ?

Código
  1. void cuenta_caracteres(FILE *f){
  2.  
  3.     char car;
  4.     int i=0;
  5.  
  6.     car = (char) fgetc(f);
  7.     while(car!=EOF) {
  8.     car=(char)fgetc(f);
  9.     i++;
  10.     }
  11.  
  12.     printf("\n\nLos caracteres totales son %d\n",i-1);
  13. }
  14.  
El número de argumento compruebalo antes de cualquier hacer cualquier cosa.

Código
  1.         if(argc<2){
  2.         MostrarAyuda();
  3. exit (-1);
  4. }
  5.  
  6.  
Y luego llamas a la función como cualquier otra , siempre usando el fichero que abriste al principio
Código
  1.   if(strcmp(argv[1],"c")==0)
  2.         cuenta_caracteres(f);
  3.  

Intenta comentar e identar bien el código .
Nunca uses system("PAUSE")  en su lugar usa getchar();
La versión que he probado cuenta los caracteres , y la llamo de la siguiente manera desde linux
Código
  1. user$ gcc  cuenta.c -o cuenta
  2. user $ ./cuenta c
  3.  

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define ESPACIO ' '
  6. #define TAB '\t'
  7. #define INTRO '\n'
  8.  
  9. void MostrarAyuda();
  10. void cuenta_caracteres();
  11. void cuenta_lineas();
  12. void cuenta_palabras();
  13.  
  14. main(int argc, char *argv[]){
  15.         FILE *f;
  16.  
  17.         if((f=fopen("fichero.txt","r"))==NULL)         {
  18.         printf("No se puede abrir el fichero");
  19.         getchar();
  20.         exit (0);
  21.         }
  22.  
  23. if(argc<2){
  24.         MostrarAyuda();
  25. exit (-1);
  26. }
  27.  
  28.  
  29.         if(strcmp(argv[1],"c")==0)
  30.         cuenta_caracteres(f);
  31.  
  32.         if(strcmp(argv[1],"l")==0)
  33.         cuenta_lineas(f);
  34.  
  35.         if(strcmp(argv[1],"p")==0)
  36.         cuenta_palabras(f);
  37.  
  38.  
  39.  
  40.         getchar();
  41. }
  42.  
  43. void MostrarAyuda()
  44. {
  45.     printf("\n-c: Cuenta el numero de caracteres del fichero\n");
  46.     printf("\n-l: Cuenta el numero de lineas del fichero\n");
  47.     printf("\n-p: Cuenta el numero de palabras del fichero\n");
  48. }
  49.  
  50. void cuenta_caracteres(FILE *f){
  51.  
  52.     char car;
  53.     int i=0;
  54.  
  55.     car = (char) fgetc(f);
  56.     while(car!=EOF) {
  57.     car=(char)fgetc(f);
  58.     i++;
  59.     }
  60.  
  61.     printf("\n\nLos caracteres totales son %d\n",i-1);
  62. }
  63.  
  64. void cuenta_palabras(FILE *f)
  65. {
  66.  
  67.     char car;
  68.     int palabra=0;
  69.  
  70.     while(car!=EOF)
  71.     {
  72.     if(car==ESPACIO || car==TAB || car==INTRO)
  73.     palabra++;
  74.     }
  75.  
  76.     printf("\n\nEl archivo contiene %d palabras\n",palabra+1);
  77. }
  78.  
  79. void cuenta_lineas(FILE *f)
  80. {
  81.  
  82.     char car;
  83.     int linea=0;
  84.  
  85.     while(car!=EOF)     {
  86.     printf("%c",car);
  87.     car=fgetc(f);
  88.     if(car=='\n')
  89.     linea++;
  90.     }
  91.  
  92.     printf("\n\nEl archivo contiene %d lineas\n",linea);
  93. }
  94.  
  95.  
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
alexlopez91

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Ayuda ejercicio C
« Respuesta #4 en: 8 Junio 2011, 17:42 pm »

Vale, gracias por contestar. Ya lo tengo bien casi todo, solo me falla que si pongo en la linea de comandos Cuenta + el nombre del fichero me llame a las tres funciones y me muestre todos los resultados. Lo que pasa que tal y como lo tengo puesto solo me muestra bien la primera opcion. Las demas no me las hace.

Por ejemplo: Si pongo Cuenta fichero.txt me cuenta bien los caracteres pero no las palabras y las lineas.

Me falla esto

if(argc==2)
{
cuenta_caracteres(f);
cuenta_lineas(f);
cuenta_palabras(f);
}

Mirad el codigo

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ESPACIO ' '
#define TAB '\t'
#define INTRO '\n'

void MostrarAyuda();
void cuenta_caracteres(FILE *);
void cuenta_lineas(FILE *);
void cuenta_palabras(FILE *);

main(int argc, char *argv[])
{
         if(argc==1)
         {
         printf("\n\t\t\tAYUDA\n");
         MostrarAyuda();
         }
        
         FILE *f;
        
         if((f=fopen(argv[1],"r"))==NULL)
         {
         printf("\nNo se puede abrir el fichero\n");
         getchar();
         }
        
         if(argc==2)
         {
         cuenta_caracteres(f);
         cuenta_lineas(f);
         cuenta_palabras(f);
         }
        
         else if(argc==3)
         {
         if(strcmp(argv[2],"-c")==0)
         cuenta_caracteres(f);
        
         if(strcmp(argv[2],"-l")==0)
         cuenta_lineas(f);
        
         if(strcmp(argv[2],"-p")==0)
         cuenta_palabras(f);
         }
        
         fclose(f);
}

void MostrarAyuda()
{
     printf("\n-c: Cuenta el numero de caracteres del fichero\n");
     printf("\n-l: Cuenta el numero de lineas del fichero\n");
     printf("\n-p: Cuenta el numero de palabras del fichero\n");
}

void cuenta_caracteres(FILE *f)
{
     int c, cont=0;

     while((c=getc(f))!=EOF)
     {
     if(c!='\n')
     cont++;
     }
    
     printf("\n\nLos caracteres totales son %d\n",cont);
    
}

void cuenta_palabras(FILE *f)
{
     char car;
     int palabra=0;
     int i;
    
     while(car!=EOF)
     {
     car=fgetc(f);
     i++;
     if(car==ESPACIO || car==INTRO || car==TAB)
     palabra++;
     }
    
     printf("\n\nLas palabras totales son %d\n",palabra+1);
}

void cuenta_lineas(FILE *f)
{
    
     char car;
     int linea=0;
    
     while(car!=EOF)
     {
     car=fgetc(f);
     if(car=='\n')
     linea++;
     }
    
     printf("\n\nLas lineas totales son %d\n",linea+1);
}
« Última modificación: 8 Junio 2011, 17:45 pm por alexlopez91 » En línea

Gallu

Desconectado Desconectado

Mensajes: 247



Ver Perfil
Re: Ayuda ejercicio C
« Respuesta #5 en: 8 Junio 2011, 20:46 pm »

No estás tan perdido de la solución. Un consejo , utiliza GeSHI para postear el código .
Recuerda comentar el código.
En la función de contar carácteres estás contanto también los espacios, es correcto para ti ?
Olvidabas el return después de MostrarAyuda.
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. #define ESPACIO ' '
  6. #define TAB '\t'
  7. #define INTRO '\n'
  8.  
  9. void MostrarAyuda();
  10. void cuenta_caracteres(FILE *);
  11. void cuenta_lineas(FILE *);
  12. void cuenta_palabras(FILE *);
  13.  
  14. main(int argc, char *argv[])
  15. {
  16.         if(argc==1)         {
  17. printf("\n\t\t\tAYUDA\n");
  18. MostrarAyuda();
  19. return;
  20.         }
  21.  
  22.         FILE *f;
  23.  
  24.         if((f=fopen(argv[1],"r"))==NULL)
  25.         {
  26. printf("\nNo se puede abrir el fichero\n");
  27.  
  28.         }        
  29.  
  30.  
  31. // el argumento 0 es el nombre del programa y el 1 es el nombre del fichero, con lo cual no debemos tratarlos
  32. int i = 2 ;
  33. for (i ; i < argc ;i++){
  34. //por cada argumento
  35. if(strcmp(argv[i],"-c")==0)
  36. cuenta_caracteres(f);
  37.  
  38. if(strcmp(argv[i],"-l")==0)
  39. cuenta_lineas(f);
  40.  
  41. if(strcmp(argv[i],"-p")==0)
  42. cuenta_palabras(f);
  43. }
  44.  
  45.         fclose(f);
  46. }
  47.  
  48. void MostrarAyuda(){
  49.  
  50.     printf("\n-c: Cuenta el numero de caracteres del fichero\n");
  51.     printf("\n-l: Cuenta el numero de lineas del fichero\n");
  52.     printf("\n-p: Cuenta el numero de palabras del fichero\n");
  53. }
  54.  
  55. void cuenta_caracteres(FILE *f){
  56.     int c, cont=0;
  57.  
  58.     while((c=getc(f))!=EOF) {
  59.     if(c!='\n')
  60.     cont++;
  61.     }
  62.  
  63.     printf("\n\nLos caracteres totales son %d\n",cont);
  64.  
  65. }
  66.  
  67. void cuenta_palabras(FILE *f){
  68.     char car;
  69.     int palabra=0;
  70.     int i;
  71.  
  72.     while(car!=EOF){
  73.     car=fgetc(f);
  74.     i++;
  75.  
  76.     if(car==ESPACIO || car==INTRO || car==TAB)
  77.     palabra++;
  78.     }
  79.  
  80.     printf("\n\nLas palabras totales son %d\n",palabra);
  81. }
  82.  
  83. void cuenta_lineas(FILE *f){
  84.  
  85.     char car;
  86.     int linea=0;
  87.  
  88.     while(car!=EOF) {
  89.     car=fgetc(f);
  90.  
  91.     if(car=='\n')
  92.     linea++;
  93.     }
  94.  
  95.     printf("\n\nLas lineas totales son %d\n",linea);
  96. }
  97.  
  98.  
  99.  
« Última modificación: 8 Junio 2011, 20:54 pm por Didacso » En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Ejercicio C 100
Ejercicios
Dem0ny 2 6,235 Último mensaje 19 Diciembre 2007, 22:45 pm
por Dem0ny
Ayuda co un ejercicio de C#
.NET (C#, VB.NET, ASP)
hitori batusai 2 5,580 Último mensaje 22 Febrero 2008, 01:53 am
por hitori batusai
Ayuda con ejercicio de VB
Programación Visual Basic
guada_sp 5 3,587 Último mensaje 8 Marzo 2008, 02:54 am
por ‭‭‭‭jackl007
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 16,577 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
Ayuda ejercicio de Pascal, cuando uno no lo ve claro pide ayuda
Programación General
manu3742 1 3,525 Último mensaje 31 Marzo 2011, 15:43 pm
por d(-_-)b
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines