Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kiara_luna en 3 Abril 2011, 00:27 am



Título: programa c++
Publicado por: kiara_luna en 3 Abril 2011, 00:27 am
hola quiero crear un programa que capture un archivo.cpp y me diga el numero de lineas, el numero de variables y que tipo de variables son(int, float, char), ya pude capturar el archivo y contar las lineas pero no se como contar las variables ayuda!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void main()
{
 clrscr();
 FILE *archivo;
 int v_c;
 int v_contador=0;
 int v_contador2=0;
 int v_contador3=0;
 char v_nombre[25];

 char *aray[4];
 int i;
 aray[0] = strdup("if");
 aray[1] = strdup("for");
 aray[2] = strdup("while");
 aray[3] = strdup("else");


 printf("Digite el nombre del archivo, con su respectiva extensión\n");
 scanf("%s",v_nombre); //El usuario ingresa el nombre
 archivo = fopen(v_nombre, "r"); //Abrimos el archivo

 if (archivo == NULL) //En caso de que no exista el archivo
 {
  printf("El archivo no existe \n");
  exit (EXIT_FAILURE);
 }
 else
 {
  while (v_c!=EOF)
  {
   v_c = getc(archivo); // Obtiene un caracter del archivo
   putchar(v_c); // Lo despliega en pantalla y continua..

   if (v_c==59) // valor Accii del punto y coma ";"
   {
    v_contador++;
    
   }
   if (v_c==125)
   {
   v_contador2++;
   }
   if(v_c==32||v_c==10) //Contador de palabras
   {
    v_contador3++;
   }
  }

  fclose(archivo); // Cerramos el Archivo de texto
  printf("\n\n\n\n El numero de Lineas que termina en ; es: %d",v_contador);
  printf("\n # de lineas que finalizan en %d",v_contador2);
  printf("\n # de Palabras es: %d",v_contador3);

 }
 getch();
}



Título: Re: contar lineas y variables de archvio.cpp
Publicado por: Don Pollo en 3 Abril 2011, 02:45 am
Deberías crear plantillas para poder ir comparando con las palabras que te encuentres en el texto. Yo compararía carácter a carácter todas las palabras con todas las plantillas y si con una sola letra ya no equivale a la plantilla con la que la estoy usando ó paso a la siguiente palabra porque ya he usado todas las plantillas con dicha palabra ó paso de plantilla.

Ni que decir tiene que las plantillas serían "char", "float", "int" y todos los tipos de variables que quieras contabilizar.


Título: Re: contar lineas y variables de archvio.cpp
Publicado por: leogtz en 3 Abril 2011, 08:31 am
Yo separaría todo por tokens, algo así:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main(void)
  5. {
  6.    FILE *file = fopen("./archivo.cpp", "r");
  7.    if(file == NULL)
  8.    {
  9.        perror("Error abriendo archivo");
  10.        exit(EXIT_FAILURE);
  11.    }
  12.  
  13.    char linea[1000], *token;
  14.    unsigned i = 0;
  15.  
  16.    while(fgets(linea, 999, file) != NULL)
  17.    {
  18.        i++;
  19.        token = strtok(linea, " ");
  20.        if(!strcmp(token, "int"))
  21.        {
  22.            printf("He encontrado la definición de una variable int en la línea : %d\n", i);
  23.        }
  24.        token = strtok(NULL, " ");
  25.  
  26.    }
  27.    fclose(file);
  28.    return EXIT_SUCCESS;
  29. }
  30.  

Salida analizando el archivo que pones:


Código:
[leo@archero c_proyects]$ ./code
He encontrado la definición de una variable int en la línea : 9
He encontrado la definición de una variable int en la línea : 10
He encontrado la definición de una variable int en la línea : 11
He encontrado la definición de una variable int en la línea : 12
He encontrado la definición de una variable int en la línea : 16
[leo@archero c_proyects]$


Título: Re: contar lineas y variables de archvio.cpp
Publicado por: kiara_luna en 4 Abril 2011, 00:04 am
hola,
trate de correr el programa como tu lo planteastes pero no corre?? no entiendo porq.., me dijeron que lo hiciera con substring pero la verdad no he manejado eso??


Título: Re: contar lineas y variables de archvio.cpp
Publicado por: leogtz en 4 Abril 2011, 00:07 am
Si estas en Windows, quita edita esta línea:

Código:
FILE *file = fopen("./archivo.cpp", "r");

Y dejala así:

Código:
FILE *file = fopen("archivo.cpp", "r");

Obviamente archivo.cpp debe estar en la misma ubicación (carpeta) donde esté el ejecutable. Añade una pausa al final para que puedas ver el resultado y no se te cierre la consola.


Título: Re: contar lineas y variables de archvio.cpp
Publicado por: kiara_luna en 4 Abril 2011, 00:45 am
hola gracias por tu ayuda, ya arregle mi programa con lo que tu me diste de aporte, el pequeño problema que se me presento es que no me esta contando ahora las lineas
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
void main()
{
  clrscr();
  FILE *file;
  int v_c;
  int v_contador=0;
  int v_contador2=0;
  int v_contador3=0;
  char v_nombre[25];

  char *aray[4];
  int i;
  aray[0] = strdup("if");
  aray[1] = strdup("for");
  aray[2] = strdup("while");
  aray[3] = strdup("else");


  printf("Digite el nombre del archivo, con su respectiva extensión\n");
  scanf("%s",v_nombre); //El usuario ingresa el nombre
  file = fopen(v_nombre, "r"); //Abrimos el archivo

  if (file == NULL) //En caso de que no exista el archivo
  {
    printf("El archivo no existe \n");
    exit (EXIT_FAILURE);
  }
  else
   {
  while (v_c!=EOF)
 {
     v_c = getc(file); // Obtiene un caracter del archivo
     putchar(v_c); // Lo despliega en pantalla y continua..

    if (v_c==59) // valor Accii del punto y coma ";"
     {
       v_contador++;
   
     }
    if (v_c==125)
     {
       v_contador2++;
     }
   if(v_c==32||v_c==10) //Contador de palabras
   {
     v_contador3++;
   }
   char linea[1000], *token;
   unsigned i=0;
    while(fgets(linea, 999, file) != NULL)
    {
        i++;
        token = strtok(linea, " ");
        if(!strcmp(token, "int"))
        {
            printf("He encontrado la definición de una variable int en la línea : %d\n", i);
       }
   token = strtok(NULL, " ");
    }
 
 }

  fclose(file); // Cerramos el Archivo de texto
  printf("\n\n\n\n El numero de Lineas que termina en ; es: %d",v_contador);
  printf("\n # de lineas que finalizan en } %d",v_contador2);
  printf("\n # de Palabras es: %d",v_contador3);

 }
 getch();
}



Título: Re: contar lineas y variables de archvio.cpp
Publicado por: leogtz en 4 Abril 2011, 01:00 am
Si pusiste atención (creo que no) te darías cuenta que la variable "i" guarda el número de líneas.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main(void)
  5. {
  6.    FILE *file = fopen("./archivo.cpp", "r");
  7.    if(file == NULL)
  8.    {
  9.        perror("Error abriendo archivo");
  10.        exit(EXIT_FAILURE);
  11.    }
  12.  
  13.    char linea[1000], *token;
  14.    unsigned i = 0;
  15.  
  16.    while(fgets(linea, 999, file) != NULL)
  17.    {
  18.        i++;
  19.        token = strtok(linea, " ");
  20.        if(!strcmp(token, "int"))
  21.        {
  22.            printf("He encontrado la definición de una variable int en la línea : %d\n", i);
  23.        }
  24.        token = strtok(NULL, " ");
  25.  
  26.    }
  27.    printf("\nLineas totales : %d\n", i);
  28.    fclose(file);
  29.    return EXIT_SUCCESS;
  30. }
  31.  


Título: Re: contar lineas y variables de archvio.cpp
Publicado por: anonimo12121 en 4 Abril 2011, 10:32 am
Algo así se podría hacer?
Código
  1. string c
  2. int numeros_de_int=0;
  3. ifstream f("file.cpp");
  4. file >> s;
  5. for(int i=0;c[i];i++){
  6. if(c[i]=='i' && c[i+1]=='n' && c[i+2]=='t' && ( c[i+3]== ' ' || c[i+3]=='*')
  7. for(int j=i;c[j]!=';';j++){
  8. if(c[j]==',')numeros_de_int++;
  9. }
  10. }
  11.  
Podría funcionar esto pero tendría más bugs que windows XDD ademas que file >> s se corta en espacios xD pero podría ser una comparación similar a la que he hecho creo. xDD suerte

PD: lo escrito aquí asique supongo que habrá muchos fallos.


Título: Re: contar lineas y variables de archvio.cpp
Publicado por: leogtz en 4 Abril 2011, 14:36 pm
De que puede funcionar puede, pero sería mucho engorro haciéndolo así.


Título: Re: programa c++
Publicado por: kiara_luna en 10 Abril 2011, 22:35 pm
hola xafi, gracias por tu aporte lo intente por ese lado y me funcionó a la perfeccion, solo que demore un poco mas... pero bueno mi pregunta ahora es si puede en ese mismo programa contar los comentarios  que hay en el archivo que cargue  a traves de token y si la sentencia podria ir igual a la de contar el int??? if(!strcmp(token, "//"))