Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 7 Septiembre 2013, 03:10 AM

Título: leer caracteres de un archivo
Publicado por: m@o_614 en 7 Septiembre 2013, 03:10 AM
Saludos

Tengo el siguiente codigo que lee el primer y último carácter de un archivo de texto y los muestra en pantalla.La prueba consiste en mostrar el primer y último carácter correctamente independientemente del tamaño del archivo.

El codigo ya pude verificar que funciona para textos pequenios como: "Hola mundo" o "Tres tristes tigres tragaban trigo en un trigal", en el caso del primero me aparece primer caracter :H, ultimo caracter: o, pero si se trata de un archivo de texto un poco grande no me imprime el ultimo caracter y no entiendo por que

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

int main()
{
   FILE *fd;
   int inicio,fin;
   if((fd = fopen("F:\\archivo1.txt","r"))!=NULL)
   {
       if((inicio = fseek(fd,0,SEEK_SET)) != 0)
          printf("No se pudo posicionar el cursor al inicio");
       else
          printf("El caracter que esta al inicio del archivo es: %c\n",fgetc(fd));
       if((fin = fseek(fd,-1,SEEK_END)) != 0)
          printf("No se pudo posicionar el cursor al final");
       else
          printf("El caracter que esta al final del archivo es: %c\n",fgetc(fd));
   }
   else
      printf("No se pudo abrir archivo");
   return 0;
}


el texto en cuestion tiene mas de 100 caracteres

de antemano gracias


Título: Re: leer caracteres de un archivo
Publicado por: do-while en 7 Septiembre 2013, 10:06 AM
¡Buenas!

¿Has comprobado que el último caracter no sea un salto de línea o cualquier caracter de espacio?

¡Saludos!
Título: Re: leer caracteres de un archivo
Publicado por: m@o_614 en 7 Septiembre 2013, 18:56 PM
Saludos do-while pense que con el lseek que tengo: lseef(fd,-1,SEEK_END) el cursor ya se habia posicionado una posicion antes del fin de archivo, crei que con esto seria suficiente
Título: Re: leer caracteres de un archivo
Publicado por: roilivethelife en 7 Septiembre 2013, 20:33 PM
No, asi te estas posicionando en el penultimo caracter, no en el último.

Cambia el -1 ese por un 0 y debería funcionar.

Saludos!
Título: Re: leer caracteres de un archivo
Publicado por: m@o_614 en 8 Septiembre 2013, 06:42 AM
Saludos roilivethelife hice lo que me recomendaste y no funciono porque el lseek(fd,0,SEEK_END) me coloca el puntero en el fin de archivo o sea \0 donde no hay ningun caracter y cuando le pongo lseek(fd,-1,SEEK_END) le estoy diciendo que me coloque un lugar antes del fin de archivo o sea en el ultimo caracter pero ni asi funciona
Título: Re: leer caracteres de un archivo
Publicado por: ecfisa en 8 Septiembre 2013, 11:11 AM
Hola m@o_614 .

El valor de EOF depende del sistema de archivos, pero comúnmente es interpretado con el valor -1, por lo que creo que podrías probar de este modo:

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

int main()
{
  FILE *fd;

  if((fd = fopen("F:\\archivo1.txt", "rt")) != NULL) {
    if (fseek(fd, 0L, SEEK_SET) != 0)
      printf("No se pudo posicionar el cursor al inicio");
    else
      printf("El primer caracter legible del archivo es: %c\n", fgetc(fd));

    if (fseek(fd, EOF-2 , SEEK_END) != 0) // ( EOF-2 o: -3L )
      printf("No se pudo posicionar el cursor al final");
    else
      printf("El ultimo caracter legible del archivo es : %c\n",fgetc(fd));
  }
  else
    printf("No se pudo abrir archivo");

  getchar();
  return 0;
}


Saludos :)
Título: Re: leer caracteres de un archivo
Publicado por: PoCoMoNeY en 8 Septiembre 2013, 11:38 AM
Bueno yo creo que tu código a le falta en mi opinión es comprobar que el carácter no sea ni un espacio ni un salto de linea , etc.. , tal y como te dijo  do-while
Saludos.
Título: Re: leer caracteres de un archivo
Publicado por: m@o_614 en 8 Septiembre 2013, 21:39 PM
Tenian razon,  no solo el ultimo caracter era un salto de linea o espacio, sino que los ultimos 4 caracteres tambien eran saltos de linea
Título: Re: leer caracteres de un archivo
Publicado por: rir3760 en 10 Septiembre 2013, 04:25 AM
Cita de: m@o_614 en  7 Septiembre 2013, 03:10 AMTengo el siguiente codigo que lee el primer y último carácter de un archivo de texto y los muestra en pantalla.La prueba consiste en mostrar el primer y último carácter correctamente independientemente del tamaño del archivo.
En tu programa no es necesario incluir <unistd.h> y no deberías utilizar fseek ya que se trata de un archivo en modo texto.

Cita de: m@o_614 en  8 Septiembre 2013, 21:39 PMTenian razon,  no solo el ultimo caracter era un salto de linea o espacio, sino que los ultimos 4 caracteres tambien eran saltos de linea
Puedes verificar si el carácter se puede imprimir utilizando funciones como isprint (prototipo en <ctype.h>), mas o menos así:
int ch;

/* ... */

/* Si es imprimible y no es espacio blanco se imprime tal cual ... */
if (isprint(ch) && !isspace(ch))
   printf("%c\n", ch);
else /* ... caso contrario se imprime como una secuencia de escape (Base 16) */
   printf("\'\\x%02x\'\n", ch);


Un saludo