programa c++

Iniciado por kiara_luna, 3 Abril 2011, 00:27 AM

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

kiara_luna

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

kiara

Don Pollo

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.

leogtz

Yo separaría todo por tokens, algo así:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    FILE *file = fopen("./archivo.cpp", "r");
    if(file == NULL)
    {
        perror("Error abriendo archivo");
        exit(EXIT_FAILURE);
    }

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


Salida analizando el archivo que pones:


[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]$
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

kiara_luna

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??
kiara

leogtz

Si estas en Windows, quita edita esta línea:

FILE *file = fopen("./archivo.cpp", "r");

Y dejala así:

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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

kiara_luna

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

kiara

leogtz

Si pusiste atención (creo que no) te darías cuenta que la variable "i" guarda el número de líneas.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    FILE *file = fopen("./archivo.cpp", "r");
    if(file == NULL)
    {
        perror("Error abriendo archivo");
        exit(EXIT_FAILURE);
    }

    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, " ");

    }
    printf("\nLineas totales : %d\n", i);
    fclose(file);
    return EXIT_SUCCESS;
}
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

anonimo12121

Algo así se podría hacer?
Código (cpp) [Seleccionar]

string c
int numeros_de_int=0;
ifstream f("file.cpp");
file >> s;
for(int i=0;c[i];i++){
if(c[i]=='i' && c[i+1]=='n' && c[i+2]=='t' && ( c[i+3]== ' ' || c[i+3]=='*')
for(int j=i;c[j]!=';';j++){
if(c[j]==',')numeros_de_int++;
}
}

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.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

leogtz

De que puede funcionar puede, pero sería mucho engorro haciéndolo así.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

kiara_luna

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, "//"))
kiara