質問

私は、 Unitech HT630, 、いくつかの制限で16ビットMS DOS用にコンパイルされた実行可能ファイルを実行できる独自のDOSオペレーティングシステムを実行します。これまでのところうまく機能しているデジタル火星C/C ++コンパイラを使用しています。

アプリケーションの要件の1つは、データファイルが人間が読み取る可能性のあるプレーンテキストでなければならないことです。つまり、ファイルはExcelにインポートしたり、メモ帳で開いたりすることができます。 CSVと同じように、C Standard LibraryファイルI/O関数を使用して正常に実装した変数長いレコード形式を使用しています。

レコードを保存するとき、更新されたレコードが現在データファイルにあるレコードのバージョンよりも大きいか小さいかを計算する必要があります。大きい場合は、更新されたレコードを保存する前に計算されたサイズの差によって現在のレコードの直後にすべてのレコードを最初にシフトします。 EOFは、追加データに対応するためにOSによって自動的に拡張されます。小さい場合、計算されたオフセットによってすべてのレコードを後方にシフトします。これはうまく機能していますが、最後のレコードの終了後にデータを無視するためにEOFマーカーまたはファイルサイズを変更する方法は見つかりませんでした。

データ収集プログラムは、レコードを保存するときに空のフィールドの一部にデータを埋めるため、ほとんどの時間レコードのサイズが大きくなります。レコードは、既存のエントリで修正が行われた場合にのみサイズが縮小します。また、レコード内の記述データがプログラムがメモリ内で読み取るものよりも長い場合は、通常のレコード保存の場合にのみ縮小します。

縮小記録の状況では、ファイルの最後のレコードの後、シフト前にそこに座っていたデータが残っています。 「レコードの保存」を「縮小して保存」した後、Eof Delimiterをファイルに書き込み、レコードの終了がどこにあるかを示し、残りのデータを空間充填しましたが、「成長レコードセーブ」までクリーンなファイルを持っていません。ファイルのサイズをスペースで満たされた領域に拡張します。 truncate() 機能します unistd.h うまくいきません(私は今、これは *nixフレーバーのみだと思っていますか?)。

私が見た提案されたソリューションの1つは、2番目のファイルを作成し、保存したいすべてのデータを書き込むことを含みます それ ファイルしてから、オリジナルを削除します。 4MB相当のディスクスペースしか使用できないため、ファイルサイズが2MB未満で、プログラム実行可能ファイルと構成ファイルのサイズを差し引いた場合に機能しますが、それ以外の場合は失敗します。これが生産に陥ると、ユーザーはサイズが2MBを超えるファイルになる可能性が非常に高くなります。

私は見ました ラルフブラウンの割り込みリスト および割り込み参照の IBM PCアセンブリ言語とプログラミング そして、ファイルサイズなどを更新するために何も見つからないようです。

DOSで2番目のファイルを作成することなくファイルのサイズを縮小していますか?

役に立ちましたか?

解決

DOSのファイルのサイズを減らすために、あなたは int 21 (ax=4200h, bx=handle, cx:dx=offset) ゼロの長さで書き込みを呼び出します: int 21 (ax=4000h, bx=handle, cx=0 (トランケートを意味する))

他のヒント

レコードのサイズを変更するときにレコードをシフトする代わりに、各レコードを標準サイズ(スペースなどの場合など)にパッドする「パッド」フィールドで各レコードを完成させることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top