1

私はDelphiPrismを使用しており、次のようにBinaryWriterを使用してバイナリファイルを作成および書き込みています。

method TUnit.Write(bw:BinaryWriter);
var
    i:Integer;
begin
    bw.write(ord(uType));
    bw.Write(ord(State));
    bw.Write(Address);
    bw.Write(SubAddress);

    for i:=1 to 20 do
        bw.Write(fDefs[i]);
end;

あなたへの私の質問はこれです。writeメソッドは、改行またはキャリッジリターンを使用せずに、行ごとに行を書き込むか、バイトごとにバイトを書き込むか、文字を次々に書き込みますか?

私がこの質問をしている理由は、文字の配列のような特定の文字数なしで文字列を読み書きすることに関して私が混乱しているからです。

例えば:

method WritetoFile;
var
    x:integer;
    thestr:string;
begin
    BinaryWriter thefile := new BinaryWriter(File.Create("test.dat"));
    thefile.write(thestr);
    thefile.write(x);
    thefile.Close;
end;

method ReadFromFile;
var
   x:integer;
   thestr:string;
begin
   BinaryReader thefile := new BinaryReader(File.OpenRead("test.dat"));
   thestr:=thefile.ReadString;
   x:=thefile.ReadInt32;
   thefile.Close;
end;

それが私のプログラムを書いた方法であり、それはうまくいくようですが、私が言ったように私は混乱しています。

文字列データ型の場合、読み取りまたは書き込みに特定の長さの数値を指定せずに、読み取りまたは書き込みに使用するバイト数または文字数をどのように知ることができますか?

4

2 に答える 2

4

BinaryWriterの「Writeメソッド」はDelphiのWritelnメソッドと同じように機能しますか?

いいえ、違います。

文字列データ型の場合、読み取りまたは書き込みに特定の長さの数値を指定せずに、読み取りまたは書き込みに使用するバイト数または文字数をどのように知ることができますか?

多くの点で、あなたは実際にその方法を知る必要はありませBinaryWriterBinaryReader。正しく使用しています。各呼び出しを適切なタイプのWrite()一致する呼び出しとペアリングする必要があります。ReadXXX()

ドキュメントには、基になるバイナリファイル形式が記載されています。Binary I / Oクラスがあなたに代わって正確にそれを行うので、文字列の長さを書き込んだり読み取ったりする必要はありません。

長さ接頭辞付きの文字列は、その文字列の長さを含む1バイトまたは単語を文字列の前に付けることにより、文字列の長さを表します。このメソッドは、最初に文字列の長さをUTF-7でエンコードされた符号なし整数として書き込み、次にBinaryWriterインスタンスの現在のエンコードを使用してその数の文字をストリームに書き込みます。

したがって、改行を含む文字列を安全に書き込むことができ、それが読み取られると、それらの改行は保持されます。

于 2011-09-09T13:31:49.170 に答える
2

いいえ、違います。そのためにStreamWriterを使用する必要があります。これには、必要な処理を実行するWriteLineメソッドとWriteメソッドがあります。binaryReader / Writerクラスは、長さにプレフィックス整数を使用してから、データを書き込みます。

于 2011-09-09T13:31:04.927 に答える