掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ユーザによって登録されるデータの保存について (ID:3345)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 厚かましくて、大変申し訳ないのですが、サンプルなどいただけると助かります。 あまり難しくないですよ。 以下にサンプルを示しますが、エラー処理など抜けている部分がたくさんあります。適宜直してください。 途中まで作って、今回はインデックスと本体を分ける必要がないことに気づきました。分ける必要があるのは、ファイルの一部を読み出したいときです。一度すべてを読み込んでから使うのであれば、本体にインデックスを追加し、 [次のINDEX][本体][次のINDEX][本体]... でOKです。 今回のサンプルは、インデックスと本体を分けています。 TMyRec=record Name: String; Number: String; end; TMyRecArray = array of TMyRec; ・・・ procedure TForm1.SaveToFile(const FileName: String; rec: TMyRecArray; iLength: Integer); var idxStrm: TFileStream; datStrm: TFileStream; i: integer; iBufLen, iValue: integer; buf: Pointer; begin //ファイル構造 //[IDX] //+0000(4) Length //+0004(4) rec[0].Nameのインデックス //+0008(4) rec[0].Numberのインデックス //+000C(4) rec[1].Nameのインデックス //+0010(4) rec[1].Numberのインデックス //+n*8+4+0(4) rec[n].Nameのインデックス //+n*8+4+4(4) rec[n].Numberのインデックス //[DAT] //+0000(?) rec[0].Nameの本体 //+????(1) $0 //+????(?) rec[0].Numberの本体 //+????(1) $0 idxStrm := nil; datStrm := nil; try idxStrm := TFileStream.Create(FileName + '.idx', fmCreate or fmOpenWrite); datStrm := TFileStream.Create(FileName + '.dat', fmCreate or fmOpenWrite); idxStrm.Seek(0, soFromBeginning); datStrm.Seek(0, soFromBeginning); idxStrm.Write(iLength, 4); for i := 0 to iLength - 1 do begin iValue := datStrm.Position; idxStrm.Write(iValue, 4); iBufLen := Length(rec[i].Name) + 1; buf := GetMemory(iBufLen); CopyMemory(buf, PChar(rec[i].Name), iBufLen); datStrm.Write(buf^, iBufLen); FreeMemory(buf); iValue := datStrm.Position; idxStrm.Write(iValue, 4); iBufLen := Length(rec[i].Number) + 1; buf := GetMemory(iBufLen); CopyMemory(buf, PChar(rec[i].Number), iBufLen); datStrm.Write(buf^, iBufLen); FreeMemory(buf); end; iValue := datStrm.Position; idxStrm.Write(iValue, 4); finally if Assigned(idxStrm) then idxStrm.Free; if Assigned(datStrm) then datStrm.Free; end; end; procedure TForm1.LoadFromFile(const FileName: String; var rec: TMyRecArray; var iLength: Integer); var idxStrm: TFileStream; datStrm: TFileStream; i: integer; iBufLen: integer; buf: Pointer; iPos, iNextPos: integer; begin idxStrm := nil; datStrm := nil; try idxStrm := TFileStream.Create(FileName + '.idx', fmOpenRead); datStrm := TFileStream.Create(FileName + '.dat', fmOpenRead); idxStrm.Seek(0, soFromBeginning); datStrm.Seek(0, soFromBeginning); idxStrm.Read(iLength, 4); SetLength(rec, iLength); idxStrm.Read(iPos, 4); for i := 0 to iLength - 1 do begin idxStrm.Read(iNextPos, 4); iBufLen := iNextPos - iPos; buf := GetMemory(iBufLen); datStrm.Read(buf^, iBufLen); rec[i].Name := Copy(String(buf), 1, iBufLen - 1); FreeMemory(buf); iPos := iNextPos; idxStrm.Read(iNextPos, 4); iBufLen := iNextPos - iPos; buf := GetMemory(iBufLen); datStrm.Read(buf^, iBufLen); rec[i].Number := Copy(String(buf), 1, iBufLen - 1); FreeMemory(buf); iPos := iNextPos; end; finally if Assigned(idxStrm) then idxStrm.Free; if Assigned(datStrm) then datStrm.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.