Pregunta

Me han encargado de escribir un programa de recolección de datos para un Unitech HT630 , que se ejecuta un sistema operativo propietario de DOS que se puede ejecutar archivos ejecutables compilados para 16 bits MS-DOS con algunas restricciones. Estoy usando el compilador Digital Marte C / C ++, que está funcionando bien hasta el momento.

Uno de los requisitos de la aplicación es que el archivo de datos debe ser texto sin formato legible por humanos, es decir, el archivo se puede importar en Excel o abierto por el Bloc de notas. Estoy usando un formato de registro de longitud variable al igual que CSV que he aplicado con éxito utilizando el archivo de biblioteca C estándar de E / S de funciones.

Al guardar un registro, que tiene que calcular si el registro actualizado es mayor o menor que la versión del registro actualmente en el archivo de datos. Si es mayor, yo primer turno todos los registros inmediatamente después del registro actual hacia adelante por la diferencia de tamaño calculado antes de guardar el registro actualizado. EOF se extiende automáticamente por el sistema operativo para dar cabida a los datos adicionales. Si es menor, me muevo todos los registros hacia atrás por mi decalaje calculado. Esto está funcionando bien, sin embargo no he encontrado ninguna manera de modificar el marcador EOF o tamaño de archivo de ignorar los datos después del final del último registro.

La mayoría de los registros de tiempo crecerá en tamaño debido a que el programa de recolección de datos estará llenando algunos de los campos vacíos con datos al guardar un registro. Registros sólo se encogen de tamaño cuando se hace una corrección en una entrada existente o en un disco normal, excepto si los datos descriptivos en el registro es más de lo que el programa lee en la memoria.

En la situación de un registro de contracción, después del último registro en el archivo yo me quedo con todos los datos que estaba sentado allí antes del cambio. He estado escribiendo un delimitador EOF en el archivo después de un "registro encoge Guardar" para indicar que el final de mis discos son y el espacio de llenado de los datos restantes, pero entonces ya no tengo un archivo limpio hasta que un "crecimiento récord Guardar" amplía el tamaño del archivo a través de la zona de llenado de espacio. La función truncate() en unistd.h no funciona (Ahora estoy pensando que esto es para los sabores * nix solamente?).

Una solución propuesta que he visto implica la creación de un segundo archivo y escribir todos los datos que desea guardar en que archivo, y luego borrar el original. Dado que sólo tengo 4 MB de espacio en disco digno de usar, este funciona si el tamaño del archivo es menor que 2 MB menos el tamaño de mi programa ejecutable y archivos de configuración, pero de lo contrario sería un fracaso. Es muy probable que cuando este entra en producción, los usuarios podrían terminar con un archivo superior a 2 MB de tamaño.

He mirado en la lista de interrupción de Ralph Brown y la referencia de interrupción en IBM PC en lenguaje ensamblador y programación y me parece que no puede encontrar nada para actualizar el archivo tamaño o similar.

es la reducción del tamaño de un archivo sin crear un segundo archivo incluso posible en DOS?

¿Fue útil?

Solución

Para reducir el tamaño de un archivo en DOS, busque hasta el punto de truncamiento con int 21 (ax=4200h, bx=handle, cx:dx=offset) y llamada de escritura con longitud cero: int 21 (ax=4000h, bx=handle, cx=0 (que significa truncado))

Otros consejos

Como una alternativa a los cambios de los registros en torno al cambiar el tamaño de un disco, que podría terminar cada registro con un campo "pad" que las almohadillas hacia fuera para un tamaño estándar (por ejemplo, con espacios o similares).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top