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

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  problema con getc()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: problema con getc()  (Leído 1,688 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
problema con getc()
« en: 26 Septiembre 2013, 20:19 pm »

Saludos

tengo el siguiente codigo que me tiene que leer un archivo de texto e imprimir cuantas veces aparece un caracter, para esto uso el fgetc para que vaya leyendo 1 por 1 pero no me imprime correctamente

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 100
  5.  
  6. int main()
  7. {
  8.    int i,tam,cont;
  9.    char nombre[MAX],archivo[MAX],car,opcion,*ptr;
  10.    FILE *fd,*ap;
  11.    printf("Dame el nombre del archivo: ");
  12.    fgets(nombre,MAX,stdin);
  13.    if ((ptr = strchr(nombre, '\n')) != NULL)
  14.       *ptr = '\0';
  15.    sprintf(archivo,"F:\\%s.txt",nombre);
  16.    ap = fopen("Archivo_producto","w");
  17.    if((fd = fopen(archivo,"r"))!=NULL)
  18.    {
  19.        printf("Elige una opcion\n");
  20.        printf("a) Comprimir archivo\n");
  21.        printf("b) Descomprimir archivo\n");
  22.        switch(opcion = getchar())
  23.        {
  24.            case 'A':case'a':
  25.               cont = 0;
  26.               fseek(fd,0,SEEK_END);
  27.               tam = ftell(fd);
  28.               fseek(fd,0,SEEK_SET);
  29.                   for(i=0;i <= tam;i++)
  30.                   {
  31.                       if((car = fgetc(fd))== 'd');
  32.                          cont++;
  33.                   }
  34.               printf("%d",cont);
  35.               break;
  36.            default:
  37.               printf("La opcion no existe\n");
  38.        }
  39.    }
  40.    else
  41.       printf("No se pudo abrir el archivo");
  42.    return 0;
  43. }
  44.  

de antemano gracias


« Última modificación: 26 Septiembre 2013, 20:32 pm por m@o_614 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: problema con getc()
« Respuesta #1 en: 27 Septiembre 2013, 03:05 am »

Problemas con el programa hay dos:

1) Cuando abres un archivo en modo texto no debes utilizar la función fseek para calcular su tamaño (numero de caracteres). En su lugar para procesar cada uno de los caracteres en el archivo puedes utilizar un bucle como este:
Código
  1. FILE *entrada;
  2. int ch;
  3.  
  4. /* apertura del archivo */
  5.  
  6. while ((ch = fgetc(entrada)) != EOF){
  7.   /* ... */
  8. }

2) El valor de retorno de las funciones getchar, getc y fgetc es de tipo int.

----

El error que mencionas se genera en esta parte del programa:
Código
  1. if((car = fgetc(fd))== 'd');
  2.   cont++;
Revisa el fragmento con cuidado, lo solucionas en cuestión de minutos.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: problema con getc()
« Respuesta #2 en: 28 Septiembre 2013, 00:00 am »

rir3760, estas seguro que el getc() retorna un int??, es que leia en una pagina que me regresaba el caracter leido del fichero, bueno el punto es que eso ya funciona ya lo cale y si me imprime el numero de veces que aparece un caracter. Pero ahora cambie un poco el codigo, ahora cada vez que el getc me encuentre el caracter vacio  ' ', me tiene que agarrar los siguientes 3 caracteres que le siguen  al '  ', guardarlos en un arreglo e imprimirlos, el unico problema es que no me imprime el caracter vacio pero si me imprime los 3 caracteres que le siguen, como puedo corregir esto?

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 100
  5.  
  6. int main()
  7. {
  8.    int i,j,cont;
  9.    char nombre[MAX],archivo[MAX],*palabra,car,opcion,*ptr;
  10.    char *p[]={" de "," para "," con "," desde "," al "};
  11.    FILE *fd,*ap;
  12.    printf("Dame el nombre del archivo: ");
  13.    fgets(nombre,MAX,stdin);
  14.    if((ptr = strchr(nombre,'\n')) != NULL)
  15.       *ptr = '\0';
  16.    sprintf(archivo,"F:\\%s.txt",nombre);
  17.    ap = fopen("Archivo_producto","w");
  18.    if((fd = fopen(archivo,"r"))!= NULL)
  19.    {
  20.        printf("Elige una opcion\n");
  21.        printf("a) Comprimir archivo\n");
  22.        printf("b) Descomprimir archivo\n");
  23.        switch(opcion = getchar())
  24.        {
  25.            case 'A':case'a':
  26.               for(i=0;i < 1;i++)
  27.               {
  28.                   while((car = fgetc(fd))!= EOF)
  29.                   {
  30.                       if(car == ' ')
  31.                       {
  32.                           palabra = (char*)malloc(strlen(p[i])*sizeof(char));
  33.                           fgets(palabra,strlen(p[i]),fd);
  34.                           printf("%s\n",palabra);
  35.                       }
  36.                   }
  37.               }
  38.  
  39.               break;
  40.            default:
  41.               printf("La opcion no existe\n");
  42.        }
  43.    }
  44.    else
  45.       printf("No se pudo abrir el archivo");
  46.    return 0;
  47. }
  48.  

de antemano gracias
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: problema con getc()
« Respuesta #3 en: 29 Septiembre 2013, 03:12 am »

estas seguro que el getc() retorna un int?
Si.

es que leia en una pagina que me regresaba el caracter leido del fichero
Cierto pero la función debe retornar el carácter leído (puede ser cualquiera) o bien EOF en caso de error o fin de archivo. Ese rango de valores (cualquier carácter mas EOF) es uno mas del que que se puede almacenar en una variable de tipo char, por eso las funciones getchar, getc y fgetc retornan un valor de tipo int.

Si no tienes un referencia de calidad es hora de conseguir una, así puedes resolver dudas de este tipo en cuestión de minutos.

el unico problema es que no me imprime el caracter vacio pero si me imprime los 3 caracteres que le siguen, como puedo corregir esto?
Porque el espacio lo acabas de leer al utilizar fgetc, lo mas sencillo es regresar ese carácter al stream mediante la función ungetc antes de la llamada a fgets:
Código
  1. ungetc(car, fd);
  2. fgets(palabra, strlen(p[i]), fd);

Aparte de eso en el programa tienes un bucle que itera una solo vez, no es necesaria la conversión explicita en la llamada a malloc y no tiene caso utilizar "sizeof(char)" ya que este siempre es igual a uno.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,308 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
getc() y printf
Programación C/C++
m@o_614 1 1,890 Último mensaje 12 Septiembre 2013, 23:44 pm
por ecfisa
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines