getc() y printf

Iniciado por m@o_614, 12 Septiembre 2013, 22:11 PM

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

m@o_614

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,

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    int fin,mitad;
    char letra;
    FILE *fd;
    if((fd = fopen("F:\\archivo_fuente.txt","r"))!=NULL)
    {
        fseek(fd,-1,SEEK_END);
        fin = ftell(fd);
        printf("%d\n",fin);
        mitad = fin/2;
        printf("%d\n",mitad);
        fseek(fd,mitad,SEEK_SET);
        fread(&letra,sizeof(char),1,fd);
        printf("%c",getc(fd));
    }
    else
       printf("No se pudo abrir archivo");
    return 0;
}


y si al printf le pongo

fread(&letra,sizeof(char),1,fd);
        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

ecfisa

#1
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:

 ...
 printf("Caracter central: %c", letra);
 ...

tendría que funcionar.

Pero si tu intención es sólo mostrar el caracter central, podrias hacer:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fd;

  if((fd = fopen("C:\\PRUEBA.txt","rt"))!= NULL) {
   fseek(fd, 0L, SEEK_END);
   fseek(fd, ftell(fd) >> 1, SEEK_SET);
   printf("Caracter central: %c", fgetc(fd));
    fclose(fd);
  }
  else
    printf("No se pudo abrir archivo");
  return 0;
}


Saludos :)