Cómo leer y mostrar datos de archivo usando la función int86 con la estructura REGS para 8086 en lenguaje C.
Tengo un archivo de texto con contenido del cual debo mover el cursor de forma relativa al BOF (Beginning of File) y mostrar su contenido en la pantalla usando int 21h/42h.
Aquí está el código en el que estoy trabajando. Estoy usando Windows 98 (DOS de 16 bits) en una máquina virtual y es parte de mi tarea de programación de sistemas, así que tengo que usarlo. Intenté usar Turbo C++ con DOSBox, pero tiene algunos problemas.
Al imprimir “buff”, muestra valores aleatorios.
Código
#include <stdio.h>
#include <conio.h>
#include <fcntl.h>
#include <bios.h>
#include <dos.h>
unsigned int handle;
char buff[50];
void main(){
union REGS regs; // establecer puntero
union REGS regs_r; // leer archivo
handle = open("text.txt", O_RDONLY);
// establecer puntero al BOF (Beginning of File)
regs.x.bx = handle;
regs.h.ah = 0x42; // LSEEK
regs.h.al = 0x00; // Modo (0) BOF
regs.x.cx = 0;
regs.x.dx = 0;
int86(0x21, ®s, ®s);
// leer el archivo
regs_r.x.bx = handle;
regs_r.x.cx = 0x07; // ¿Bytes a leer?
regs_r.h.ah = 0x3fh;
regs_r.x.dx = (unsigned int) buff; // buffer para los datos
int86(0x21, ®s_r, ®s_r);
printf("DATOS: %c", buff);
getch();
clrscr();
}
Aquí hay algunos enlaces de referencia
Cualquier ayuda será apreciada.</dos.h></bios.h></fcntl.h></conio.h></stdio.h>
davy.ai
Para mover el cursor desde relativo al comienzo del archivo (BOF) y mostrar su contenido en la pantalla utilizando int 21h/42h, se puede utilizar el siguiente código:
Hubo un par de problemas en el código original:
– La instrucción
printf
solo estaba imprimiendo el primer carácter del búfer. Para imprimir todo el contenido, debemos usar%s
en lugar de%c
.– El tamaño de los datos a leer no se estableció correctamente. Necesitamos usar
sizeof(buff)
para asegurarnos de leer todo el búfer.– Faltaba la función
close
, que es necesaria para cerrar correctamente el identificador del archivo.¡Espero que esto ayude!</dos.h></bios.h></fcntl.h></conio.h></stdio.h>