メモリ操作について


さーちん  2004-05-15 23:46:12  No: 8984

こんにちは。
メモリ操作について、いろいろ調べているのですが、
よくわからずに困っています。
誰かご存知の方おりましたら、アドバイスよろしくお願い致します。

私がやりたい処理は以下です。

1.ファイルからデータを読込み、その先頭アドレスを保持。
2.メモリで保持しているファイルの内容を変更したい。

例)ファイルの内容:20040515,あいうえお,かきくけこ,さしすせそ
                    20040516,たちつてと,なにぬねの,はひふへほ

    「20040516」で検索をかけ、見つかったアドレスに、
    「20040516,アイウエオ,カキクケコ,サシスセソ」と書き込む。

  この処理が終わった後のメモリ上は、
    20040515,あいうえお,かきくけこ,さしすせそ
    20040516,アイウエオ,カキクケコ,サシスセソ
 となっている。

すみませんが、わかる方アドバイスよろしくお願いします。


ふぐちゃん  2004-05-16 00:31:40  No: 8985

TStringListは試されましたか?


uuu  2004-05-16 04:19:52  No: 8986

メモリにこだわるなら 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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加