これまでのところ、IBM 8086アーキテクチャーを組み立てて練習していましたが、2行のファイルを交換するプログラムを作成する作業を受けました。 (私は、データファイル名とその2行のうちのnoをパラメータで与える)。私のプログラムのアルゴリズムは以下の通りです:非テキスト形式のファイルで改行記号の並びはどうですか?
1)私は制限されたサイズのバッファ(例えば、20バイトのサイズのバッファ)を使用しています。私はファイルからこのバッファにデータを読み込み、ファイルの終わりに達すると常にaxレジスタの値をチェックします。
2)私は、このバッファを13dシンボル(CR ASCIIコード)をチェックし、バッファの要素を新しいwrite-to-fileバッファに渡すプロシージャに渡します。シンボル13dが検出されたらwrite-to-fileバッファが停止し、新しい行トリガ変数が1に設定されます。次に、この改行13dシンボルが見つかった場合、正しい位置にファイルポインタを返す別のプロシージャを呼び出します(カスタムサイズバッファを使用するため、バッファの真ん中にシンボルがあるので、新しい行を修正するためにポインタをリセットする必要があります)。
私のプログラムは.txtファイルで正しく動作しているようですが、たとえば.exeや.jpgファイルの2行をランダムに交換しようとしたときに、同じ行を再び交換するとそのファイルを開くことができませんOSはそれが壊れていると言いますから。
質問:2行の非テキスト形式のファイルを交換してから、変更して新しいファイルが正常に動作することを期待してもいいですか?このコンセプトは理論的には機能すべきでしょうか?または、さまざまな異なる改行シーケンスの解釈(CF + NL、NL + CFなど)によって、変換されたプログラムが破損するのは間違いありませんか?
つまり、テキスト以外のファイルの改行記号の解釈は何ですか?それらのシーケンスは正しいプログラム操作にとって重要ですか?
ご回答ありがとうございます。質問に答えるためにコードの一部が必要な場合は、私にご連絡ください。
この方法では、ファイルをバイトごとに元のファイルと同じにすることができます。もしそうでなければ、それはほとんど間違いないでしょう。これはアセンブリ言語です。あなたのために改行を正規化しようとするライブラリ関数を通してデータを読み込まない限り、すべてが単なるバイトです。 'md5sum'や' crc32'のようなものを使って、ファイルの内容をハッシュするか、オリジナルに対して 'diff'や' cmp'だけを使うことをお勧めします。 (これらはUNIXのシェルコマンドですが、それに相当するウィンドウがあり、その名前は明白でなければなりません) –
バッファサイズが制限されていますか?だから、あなたが "行"を見つけたら、実際には先行する18バイトまでしか移動しないでしょうか?あなたが実装する方法によっては、新しく配置されたデータの開始時にライン検出が同じ状態になると、それは問題ではないかもしれません。私はあなたのアルゴリズムの詳細を正確には読まなかった。 –