4

私は、Unitech HT630のデータ収集プログラムを作成する任務を負っています。このプログラムは、16ビットMSDOS用にコンパイルされた実行可能ファイルをいくつかの制限付きで実行できる独自のDOSオペレーティングシステムを実行します。私はこれまでうまく機能しているDigitalMarsC /C++コンパイラを使用しています。

アプリケーション要件の1つは、データファイルが人間が読めるプレーンテキストである必要があることです。つまり、ファイルをExcelにインポートするか、メモ帳で開くことができます。C標準ライブラリファイルのI/O関数を使用して正常に実装したCSVによく似た可変長レコード形式を使用しています。

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

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

レコードが縮小している状況では、ファイルの最後のレコードの後に​​、シフト前にそこにあったデータがすべて残っています。「レコード保存の縮小」の後にEOF区切り文字をファイルに書き込んで、レコードの終わりがどこにあるかを通知し、残りのデータをスペースで埋めていましたが、「レコード保存の拡大」までクリーンなファイルがありません。スペースで埋められた領域にファイルのサイズを拡張します。のtruncate()関数は機能しunistd.hません(これは* nixフレーバー専用だと思いますか?)。

私が見た提案された解決策の1つは、2番目のファイルを作成し、そのファイルに保存するすべてのデータを書き込んでから、元のファイルを削除することです。使用するディスク容量は4MBしかないため、ファイルサイズが2MBからプログラムの実行可能ファイルと構成ファイルのサイズを引いたものよりも小さい場合は機能しますが、そうでない場合は失敗します。これが本番環境に移行すると、ユーザーはファイルのサイズが2MBを超える可能性が非常に高くなります。

ラルフ・ブラウンの割り込みリストとIBM PC Assembly Language and Programmingの割り込みリファレンスを調べましたが、ファイルサイズなどを更新するものが見つからないようです。

DOSでも、2番目のファイルを作成せずにファイルのサイズを縮小することは可能ですか?

4

2 に答える 2

4

DOSでファイルのサイズを小さくするには、で切り捨てのポイントに到達しint 21 (ax=4200h, bx=handle, cx:dx=offset)、長さがゼロのwriteを呼び出します:(int 21 (ax=4000h, bx=handle, cx=0切り捨てを意味します))

于 2010-05-19T20:29:19.333 に答える
0

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

于 2010-05-19T23:05:02.840 に答える