Ayuda ejercicio C

Iniciado por alexlopez91, 6 Junio 2011, 20:44 PM

0 Miembros y 1 Visitante están viendo este tema.

alexlopez91

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);
}

Gunit

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

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.

alexlopez91

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?

Gallu

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 ?


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

El número de argumento compruebalo antes de cualquier hacer cualquier cosa.


         if(argc<2){
          MostrarAyuda();
exit (-1);
}


Y luego llamas a la función como cualquier otra , siempre usando el fichero que abriste al principio

   if(strcmp(argv[1],"c")==0)
          cuenta_caracteres(f);


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

user$ gcc  cuenta.c -o cuenta
user $ ./cuenta c



#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");
        getchar();
        exit (0);
         }

if(argc<2){
          MostrarAyuda();
exit (-1);
}

         
         if(strcmp(argv[1],"c")==0)
          cuenta_caracteres(f);
         
         if(strcmp(argv[1],"l")==0)
          cuenta_lineas(f);
         
         if(strcmp(argv[1],"p")==0)
        cuenta_palabras(f);
         
       
         
         getchar();
}

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;
     
     car = (char) fgetc(f);
     while(car!=EOF) {
     car=(char)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);
}


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

#4
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);
}

Gallu

#5
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.
#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();
return;
        }
       
        FILE *f;
       
        if((f=fopen(argv[1],"r"))==NULL)
        {
printf("\nNo se puede abrir el fichero\n");
getchar();

        }        
       

// el argumento 0 es el nombre del programa y el 1 es el nombre del fichero, con lo cual no debemos tratarlos
int i = 2 ;
for (i ; i < argc ;i++){
//por cada argumento
if(strcmp(argv[i],"-c")==0)
cuenta_caracteres(f);
       
if(strcmp(argv[i],"-l")==0)
cuenta_lineas(f);
       
if(strcmp(argv[i],"-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);
}

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);
}


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