leer caracteres de un archivo

Iniciado por m@o_614, 7 Septiembre 2013, 03:10 AM

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

m@o_614

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



do-while

¡Buenas!

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

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

m@o_614

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

roilivethelife

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!

m@o_614

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

ecfisa

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 :)

PoCoMoNeY

#6
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.

m@o_614

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

rir3760

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