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
¡Buenas!
¿Has comprobado que el último caracter no sea un salto de línea o cualquier caracter de espacio?
¡Saludos!
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
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!
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
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 :)
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.
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
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