コードがストリームリーダーを使用していない、それは問題は、ファイルを読み込んであることを完全にそうです。次に、TFileStream
を使用して、値を変更せずにレコードを正常に読み書きする例を示します。 (明らかにあなたが最初にあなたのシステム上で有効な、書き込み可能な場所を指すようにTestFile
定数を変更する必要があります。)
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
TMyHeader = packed record
Value1: String[20];
Value2: Word;
Value3: Word;
Value4: Word;
end;
var
MyHeader: TMyHeader;
Stream: TFileStream;
const
TestFile = 'E:\TempFiles\Testheader.bin';
begin
// Initialize the record
MyHeader.Value1 := 'Testing One Two';
MyHeader.Value2 := 43140;
MyHeader.Value3 := 12345;
MyHeader.Value4 := 43140;
// Show what it contains. The `[]` brackets are to clearly delimit Value1
WriteLn(Format('Before write: [%s] %d %d %d',
[MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4]));
// Write it to the stream.
Stream := TFileStream.Create(TestFile, fmCreate, fmShareDenyNone);
try
Stream.Write(MyHeader, SizeOf(TMyHeader));
finally
Stream.Free;
end;
// Clear the contents of MyHeader before reading back, and show the empty values
FillChar(MyHeader, SizeOf(TMyHeader), 0);
WriteLn(Format('Before read: [%s] %d %d %d',
[MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4]));
Stream := TFileStream.Create(TestFile, fmOpenRead, fmShareDenyNone);
try
Stream.Read(MyHeader, SizeOf(TMyHeader));
finally
Stream.Free;
end;
// Output what we've read back in to verify it is correct
WriteLn(Format('After read: [%s] %d %d %d',
[MyHeader.Value1, MyHeader.Value2, MyHeader.Value3, MyHeader.Value4]));
Readln;
end.
おそらく、あなたは、ソース・ファイルにUTF-16の文字を持っています。 ANSIの代わりに。 – kami
問題を示す[mcve]が役立つでしょう。何が間違っているのかを推測することは不可能です。あなたのコードはストリームリーダーも使用しません。あなたは実際に何の質問をしていますか? –
私は一緒にノックさせて、私は両方のストリームリーダーとSysUtilsからのFileReadを使用して、両方が同じ結果を与える。 – kyndigs