こんにちは。
メモリ操作について、いろいろ調べているのですが、
よくわからずに困っています。
誰かご存知の方おりましたら、アドバイスよろしくお願い致します。
私がやりたい処理は以下です。
1.ファイルからデータを読込み、その先頭アドレスを保持。
2.メモリで保持しているファイルの内容を変更したい。
例)ファイルの内容:20040515,あいうえお,かきくけこ,さしすせそ
20040516,たちつてと,なにぬねの,はひふへほ
「20040516」で検索をかけ、見つかったアドレスに、
「20040516,アイウエオ,カキクケコ,サシスセソ」と書き込む。
この処理が終わった後のメモリ上は、
20040515,あいうえお,かきくけこ,さしすせそ
20040516,アイウエオ,カキクケコ,サシスセソ
となっている。
すみませんが、わかる方アドバイスよろしくお願いします。
TStringListは試されましたか?
メモリにこだわるなら TMemoryStream をつかってこんな感じ
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
ms:TMemoryStream;
begin
s := '20040515,あいうえお,かきくけこ,さしすせそ'+#13#10+
'20040516,たちつてと,なにぬねの,はひふへほ';
ms := TMemoryStream.Create;
try
ms.SetSize(Length(s)+1);// 末尾#0も書き込む
ms.WriteBuffer(s[1],Length(s)+1);
ms.SaveToFile('c:\Test.dat');
Memo1.Lines.LoadFromFile('c:\Test.dat');
finally
ms.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
s,ss:string;
ms:TMemoryStream;
i:integer;
begin
s := '20040516,アイウエオ,カキクケコ,サシスセソ';
ss := '20040516';
ms := TMemoryStream.Create;
try
ms.LoadFromFile('c:\Test.dat');
for i := 0 to ms.Size-Length(ss)+1 do
if CompareMem(pointer(integer(ms.Memory)+i),PChar(ss),Length(ss)) then
begin
ms.Position := i;
ms.WriteBuffer(s[1],Length(s));
ms.SaveToFile('c:\Test.dat');
end;
Memo1.Lines.LoadFromFile('c:\Test.dat');
finally
ms.Free;
end;
end;
ツイート | ![]() |