problema con getc()

Iniciado por m@o_614, 26 Septiembre 2013, 20:19 PM

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

m@o_614

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

int main()
{
   int i,tam,cont;
   char nombre[MAX],archivo[MAX],car,opcion,*ptr;
   FILE *fd,*ap;
   printf("Dame el nombre del archivo: ");
   fgets(nombre,MAX,stdin);
   if ((ptr = strchr(nombre, '\n')) != NULL)
      *ptr = '\0';
   sprintf(archivo,"F:\\%s.txt",nombre);
   ap = fopen("Archivo_producto","w");
   if((fd = fopen(archivo,"r"))!=NULL)
   {
       printf("Elige una opcion\n");
       printf("a) Comprimir archivo\n");
       printf("b) Descomprimir archivo\n");
       switch(opcion = getchar())
       {
           case 'A':case'a':
              cont = 0;
              fseek(fd,0,SEEK_END);
              tam = ftell(fd);
              fseek(fd,0,SEEK_SET);
                  for(i=0;i <= tam;i++)
                  {
                      if((car = fgetc(fd))== 'd');
                         cont++;
                  }
              printf("%d",cont);
              break;
           default:
              printf("La opcion no existe\n");
       }
   }
   else
      printf("No se pudo abrir el archivo");
   return 0;
}


de antemano gracias

rir3760

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:
FILE *entrada;
int ch;

/* apertura del archivo */

while ((ch = fgetc(entrada)) != EOF){
   /* ... */
}


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:
if((car = fgetc(fd))== 'd');
   cont++;

Revisa el fragmento con cuidado, lo solucionas en cuestión de minutos.

Un saludo
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

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?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

int main()
{
   int i,j,cont;
   char nombre[MAX],archivo[MAX],*palabra,car,opcion,*ptr;
   char *p[]={" de "," para "," con "," desde "," al "};
   FILE *fd,*ap;
   printf("Dame el nombre del archivo: ");
   fgets(nombre,MAX,stdin);
   if((ptr = strchr(nombre,'\n')) != NULL)
      *ptr = '\0';
   sprintf(archivo,"F:\\%s.txt",nombre);
   ap = fopen("Archivo_producto","w");
   if((fd = fopen(archivo,"r"))!= NULL)
   {
       printf("Elige una opcion\n");
       printf("a) Comprimir archivo\n");
       printf("b) Descomprimir archivo\n");
       switch(opcion = getchar())
       {
           case 'A':case'a':
              for(i=0;i < 1;i++)
              {
                  while((car = fgetc(fd))!= EOF)
                  {
                      if(car == ' ')
                      {
                          palabra = (char*)malloc(strlen(p[i])*sizeof(char));
                          fgets(palabra,strlen(p[i]),fd);
                          printf("%s\n",palabra);
                      }
                  }
              }

              break;
           default:
              printf("La opcion no existe\n");
       }
   }
   else
      printf("No se pudo abrir el archivo");
   return 0;
}


de antemano gracias

rir3760

Cita de: m@o_614 en 28 Septiembre 2013, 00:00 AMestas seguro que el getc() retorna un int?
Si.

Cita de: m@o_614 en 28 Septiembre 2013, 00:00 AMes 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.

Cita de: m@o_614 en 28 Septiembre 2013, 00:00 AMel 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:
ungetc(car, fd);
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
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