¿cómo saber si estamos al final de la linea cuando leemos con fopen?

Started by Prg, April 13, 2009, 07:17:03 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Prg

hola, quizá mi pregunta suene extraña, pero es que lo necesito porque se me ocurrió investigar cómo leer bmp e hice mi código, sin embargo me encontré con esto:
Quotey porque cada scanline de data esta alineada a 32 bits, asi que si no respeta cant_bytes_scan_line%4=0, tenes q leer un poco mas de "mierda" (1 o 2 o 3 bytes) para que quede alineado...
y me pasó en el primer gráfico que cargué, sin embargo con el segundo ya no pasa y necesito saber cuántos bytes saltarme, o al menos cuántos hay por linea, y no se me ocurre, por el momento, cómo hacerlo

aqui tengo el código si necesitan verlo:

[code language="bennu"]
import "mod_text";
import "mod_grproc";
import "mod_proc";
import "mod_video";
import "mod_map";
import "mod_screen";
import "mod_key";
import "mod_wm";
import "mod_file";
import "mod_say";
import "mod_string";
import "mod_dir";
import "mod_debug";
import "mod_map";
import "mod_draw";
private
lect;
lect2;
byte ar[800];
WORD bfType;
  DWORD bfSize;
  WORD bfReserved1;
  WORD bfReserved2;
  DWORD bfOffBits;


   DWORD  biSize;
   LONG   biWidth;
   LONG   biHeight;
   WORD   biPlanes;
   WORD   biBitCount;
   DWORD  biCompression;
   DWORD  biSizeImage;
   LONG   biXPelsPerMeter;
   LONG   biYPelsPerMeter;
   DWORD  biClrUsed;
   DWORD  biClrImportant;


begin
set_mode(800,700,32);
lect=fopen("bennu.bmp",o_read);
lect2=fopen("bennu.txt",o_write);
//fgets(lect);

ar[1]=fread(lect,bfType);
write(0,100,100,4,bfType);
ar[1]=fread(lect,bfSize);
write(0,100,150,4,bfSize);
ar[1]=fread(lect,bfReserved1);
write(0,100,200,4,bfReserved1);
ar[1]=fread(lect,bfReserved2);
write(0,100,250,4,bfReserved2);
ar[1]=fread(lect,bfOffBits);
write(0,100,300,4,bfOffBits);

ar[1]=fread(lect,biSize);
write(0,100,350,4,biSize);
ar[1]=fread(lect,biWidth);
write(0,100,400,4,biWidth);
ar[1]=fread(lect,biHeight);
write(0,100,450,4,biHeight);
ar[1]=fread(lect,biPlanes);
write(0,100,500,4,biPlanes);
ar[1]=fread(lect,biBitCount);
write(0,100,550,4,biBitCount);
ar[1]=fread(lect,biCompression);
write(0,200,100,4,biCompression);
ar[1]=fread(lect,biSizeImage);
write(0,200,150,4,biSizeImage);
ar[1]=fread(lect,biXPelsPerMeter);
write(0,200,200,4,biXPelsPerMeter);
ar[1]=fread(lect,biYPelsPerMeter);
write(0,200,250,4,biYPelsPerMeter);
ar[1]=fread(lect,biClrUsed);
write(0,200,300,4,biClrUsed);
ar[1]=fread(lect,biClrImportant);
write(0,200,350,4,biClrImportant);

graph=new_map(biWidth,biHeight,32);
y=biHeight;
x=0;
/*ar[1]=fread(lect,ar[0]);
ar[1]=fread(lect,ar[0]);
ar[1]=fread(lect,ar[0]);*/
repeat
x++;
if (x>biWidth)
x=1; y--;
ar[1]=fread(lect,ar[0]);

ar[1]=fread(lect,ar[0]);

end
ar[1]=fread(lect,ar[0]);

ar[1]=fread(lect,ar[2]);

ar[1]=fread(lect,ar[3]);

map_put_pixel(0,graph,x,y,rgb(ar[3],ar[2],ar[0]));

until (y<1)
fclose(lect);
fclose(lect2);
x=400; y=350;
while (scan_code==0)
frame;
end
end[/code]

abajo hay 2 imagenes de prueba y el codigo

gracias
eh borrado las descargas, para no ocupar espacio en el foro :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Prg

 :D hola, ya resolví mi problema, de cualquier forma muchísimas gracias. :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

TYCO

Aunque lo tienes solucionado por ti mismo, haciendo referencia a el Título del Tema, el Help dice:

DWORD FTELL(INT fichero)
Esta función devuelve la posición del puntero de lectura/escritura de un fichero abierto con la función FOPEN, siempre respecto al origen del fichero (0 para indicar el comienzo).

DWORD FEOF(INT fichero)
Esta función devuelve 1 si el puntero de lectura/escritura se encuentra al final de un fichero abierto con la función FOPEN, o 0 en caso contrario. Puede usarse en un bucle que emplee FREAD para leer datos de un fichero, hasta que ya no queden más en el mismo.

DWORD FSEEK(INT fichero, INT posición, INT referencia)
Cambia la posición de un puntero de lectura/escritura en un fichero basándose en una referencia.
La referencia puede ser una de las siguientes constantes:
SEEK_CUR    Posición actual del puntero en el fichero.
SEEK_END    Posición final del fichero.
SEEK_SET    Posición inicial del fichero.

La nueva posición puede venir dada a partir del comienzo del fichero (un número mayor o igual a 0), a partir de la posición actual (un número positivo o negativo) o a partir del final del mismo (un número negativo o 0). En todo caso, la posición se ajustará en función del tamaño actual del fichero, y se devolverá la nueva posición real, siempre respecto al origen del fichero.
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

Prg

:) gracias por el dato. y aprovechando, cuando leo con fread, si quiero leer bit a bit, exste algún tipo de dato que sea de un bit (boolean o algo así), o necesito leer byte a byte y luego descomponerlo en binario con los mod (%)?
hay alguna función para transformar de binario a decimal y viceversa?

gracias por la información amigo tyco:)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

kim-elet-o

Si mal no me equivoco, el byte es el dato mas pequeño que puede ser leido en un fichero, por lo menos en Bennu/fenix/div.

Exacto tienes que leer byte a byte el fichero, y luego montarte una funcion que te pase los datos en tipo byte a una representacion en binario. puedes utilizar el sistema de descomposicion del numero a base de mod (%), o puedes utilizar el sistema mediante mascaras de bits, hay mas formas de hacerlo pero a estas horas de la noche el cerebro se me niega a pensar.


|/
|\im-elet-o el yayo programador.

SplinterGU

bytes... la unidad minima direccionable es el byte...

para acceder bit a bit dentro de un byte tenes que usar operadores bitwise

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

ya veo, gracias.

¿los operadores bitwise se manejan como si fuera c?, para investigar en c
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)