この問題について助けが必要です。ばかげているように見えますが、解決できませんでした。可変長レコードを含むエントリ順ファイルがあります。XXX の最初の 3 バイトを置き換えるだけでよいので、このためにファイル全体を再構築する必要があります。そのため、レコードに書き込まれたバイト数を以前に知る方法がありません。
たとえば、次の 3 つのレコードを含むファイルがあります。
AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCC
DDDDDDDDDDDDDD
ファイルの REC 属性は 26 (2 番目のレコードの長さに等しい) です。プログラムを実行して最初の 3 文字を変更すると、ファイルはそのままになります (「n」を「ヌル文字」と仮定します)。
AAAAAAAAAAAAAAAANNNNNNNNNN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNNNNNNNNNNNNNNNNNNNNN
DDDDDDDDDDDDDDNNNNNNNNNNNN
プログラムを変更して必要なものを取得するにはどうすればよいですか?
XXXAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCC
DDDDDDDDDDDDDD
これは私のコードです(Java)
EnscribeFile p_origin = new EnscribeFile(file);
String first_record;
byte buffer[];
//First, charge all records and then purge the file content
ArrayList<byte[]> records = new ArrayList<byte[]>();
buffer = new byte[et.getRecordLength()];
p_origin.open(EnscribeOpenOptions.READ_WRITE,EnscribeOpenOptions.SHARED);
EnscribeFileAttributes et = p_origin.getFileInfo();
while ( p_origin.read(buffer,et.getRecordLength()) != EnscribeFile.POSITION_UNUSED )
{
byte auxRecord[] = new byte[et.getRecordLength()];
System.arraycopy(buffer,0,auxRecord,0,et.getRecordLength());
buffer = new byte[et.getRecordLength()];
records.add(auxRecord);
}
p_origin.purgeData();
//Second, modify first record
first_record = new String(records.get(0));
first_record = "XXX" + first_record.substring(3);
records.set(0,first_record.getBytes());
//Third, rewrite the records and close the file
Iterator<byte[]> i = records.iterator();
while( i.hasNext() )
p_origin.write(aux,et.getRecordLength()); //Check the note
p_origin.close();
注: 書き込み前に最初の null の前に最後の文字を取得する関数を追加することはできません。これは、以前の null またはレコードの末尾の null が可能であり、許容される可能性があるためです。例 (「N」は「null」であることを思い出してください):
AAAAAAAAAAAAAAAANN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNN
DDDDDDDDDDDDDDNN
プロセスの後、これと等しくなければなりません:
XXXAAAAAAAAAAAAANN
BBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCNN
DDDDDDDDDDDDDDNN