Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 12 Septiembre 2013, 22:11 pm



Título: getc() y printf
Publicado por: m@o_614 en 12 Septiembre 2013, 22:11 pm
Saludos, tengo el siguiente codigo que me tiene que colocar el puntero en el caracter que se encuentre en la mitad de un texto, leerlo y despues imprimirlo, el codigo funciona correctamente, la duda que tengo es que a la hora de imprimir lo hago con un printf y cuando a ese printf le digo que tome el caracter de la mitad con getc() me imprime el caracter que le sigue al de la mitad, o sea uno mas, y no se por que se comporta asi esta funcion,

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main()
  6. {
  7.    int fin,mitad;
  8.    char letra;
  9.    FILE *fd;
  10.    if((fd = fopen("F:\\archivo_fuente.txt","r"))!=NULL)
  11.    {
  12.        fseek(fd,-1,SEEK_END);
  13.        fin = ftell(fd);
  14.        printf("%d\n",fin);
  15.        mitad = fin/2;
  16.        printf("%d\n",mitad);
  17.        fseek(fd,mitad,SEEK_SET);
  18.        fread(&letra,sizeof(char),1,fd);
  19.        printf("%c",getc(fd));
  20.    }
  21.    else
  22.       printf("No se pudo abrir archivo");
  23.    return 0;
  24. }
  25.  

y si al printf le pongo

Código
  1. fread(&letra,sizeof(char),1,fd);
  2.        printf("%c",letra);
aqui si me imprime el caracter que se encuentra en la mitad y no el que le sigue. cual es la diferencia??

de antemano gracias


Título: Re: getc() y printf
Publicado por: ecfisa en 12 Septiembre 2013, 23:44 pm
Hola.

Sin dudas se debe a la lectura que previamente haces con fread ya que de ese modo desplazas el apuntador del archivo y luego lógicamente, lees el próximo con fgetc.

Si cambias por:
Código
  1.  
  2.  ...
  3.  printf("Caracter central: %c", letra);
  4.  ...
  5.  
tendría que funcionar.

Pero si tu intención es sólo mostrar el caracter central, podrias hacer:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.   FILE *fd;
  7.  
  8.   if((fd = fopen("C:\\PRUEBA.txt","rt"))!= NULL) {
  9.    fseek(fd, 0L, SEEK_END);
  10.    fseek(fd, ftell(fd) >> 1, SEEK_SET);
  11.    printf("Caracter central: %c", fgetc(fd));
  12.    fclose(fd);
  13.   }
  14.   else
  15.     printf("No se pudo abrir archivo");
  16.   return 0;
  17. }
  18.  

Saludos :)