Domanda

Sono stato incaricato con la scrittura di un programma di raccolta dati per un Unitech HT630 , che esegue un sistema operativo DOS proprietaria che può funzionare eseguibili compilati per il 16-bit MS DOS con alcune restrizioni. Sto usando il compilatore Digital Mars C / C ++, che sta lavorando bene finora.

Uno dei requisiti dell'applicazione è che il file di dati deve essere formato testo leggibile, significa che il file può essere importato in Excel o aperto da Blocco note. Sto usando una lunghezza di formato di registrazione variabile molto simile CSV che ho implementato con successo utilizzando il file libreria standard C funzioni di I / O.

Quando si salva un record, devo calcolare se il record aggiornato è più grande o più piccolo rispetto alla versione del record attualmente nel file di dati. Se più grande, ho primo turno tutti i record immediatamente dopo il record corrente in avanti dalla differenza di dimensioni calcolata prima di salvare il record aggiornato. EOF viene esteso automaticamente dal sistema operativo per accogliere i dati aggiuntivi. Se più piccolo, sposto tutti i record indietro dal mio Offset calcolato. Questo funziona bene, però ho trovato alcun modo per modificare l'indicatore EOF o la dimensione del file di ignorare i dati dopo la fine dell'ultimo record.

La maggior parte dei record di tempo crescerà in termini di dimensioni, perché il programma di raccolta dei dati sarà riempiendo alcuni dei campi vuoti con i dati durante il salvataggio di un record. Records si restringono solo nelle dimensioni quando una correzione viene eseguita su una voce esistente, o su un disco normale salvataggio se i dati descrittivi nel record è più lungo di quello che il programma legge nella memoria.

Nella situazione di un record di contrazione, dopo l'ultimo record del file che mi rimane qualsiasi dato era seduto lì prima del turno. Ho scritto un delimitatore di EOF nel file dopo un "record restringimento Salva" per segnalare dove alla fine dei miei dischi sono e che riempiono lo spazio i dati rimanenti, ma poi non è più ho un file pulito fino a quando un "crescente record di salvataggio" estende la dimensione del file sopra la zona di spazio-riempita. La funzione truncate() in unistd.h non funziona (ora sto pensando che questo è per i sapori * nix solo?).

Una soluzione proposta che ho visto comporta la creazione di un secondo file e scrivere tutti i dati che si desidera salvare in che di file, e quindi eliminare l'originale. Dal momento che ho solo 4MB vale la pena di spazio su disco per l'uso, questo funziona se la dimensione del file è inferiore a 2 MB meno la dimensione del mio programma eseguibile ei file di configurazione, ma non riuscirebbe altrimenti. E 'molto probabile che, quando questo va in produzione, gli utenti avrebbero finire con un file superiore a 2 MB di dimensione.

Ho guardato la lista di interrupt di Ralph Brown e il riferimento di interruzione in IBM PC linguaggio Assembler e Programmazione e non posso sembrare trovare qualche cosa di aggiornare il file dimensione o simili.

sta riducendo le dimensioni di un file senza creare un secondo file possibile anche in DOS?

È stato utile?

Soluzione

Per ridurre le dimensioni di un file in DOS, cercate fino al punto di troncamento con int 21 (ax=4200h, bx=handle, cx:dx=offset) e call scrittura con lunghezza zero: int 21 (ax=4000h, bx=handle, cx=0 (che significa troncamento))

Altri suggerimenti

In alternativa spostare i record in giro quando il ridimensionamento di un record, si potrebbe finire ogni record con un campo "pad" che i rilievi fuori per un formato standard (ad esempio con spazi o simili).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top