|
|
||||
Tips > |
|||||
MemoryStream でファイルを開かず文字を変更 |
更新 : 2009/12/17 |
||||
|
|
||
解説: コンポーネントを介さず、ファイルを読み込んで編集する場合、TMemoryStream オブジェクトを使うと、動的メモリバッファにデータを格納できるので便利です。 プロパティやメソッドには、メモリバッファを管理する機能が提供されているので、情報を保持し、ほかの記憶媒体を読み書きする中間オブジェクトとして利用できます。 使用例: 以下は "c:\temp\a.txt" ファイルの内容が "1234567890" である時、文字列を "123abc7890" に変更する例です。 コンポーネント Button を適当に配置してください。 コーディングは、Button1 の OnClick イベントで、書き換えたい位置と書き換えるヘッダーを用意します。 次にファイルの全内容をメモリバッファにロードします。 Position プロパティでストリームの現在位置を取得(データの先頭からのバイト数)して、Write メソッドを呼び出します。指定バイトのデータをメモリストリームのメモリバッファの現在の位置から書き込みます。 その後、 SaveToFile メソッドでストリームの内容をファイルに書き込むことで、ファイルの内容が、"123abc7890" に変更されます。 事前に "1234567890" の文字列を書き込んだ "c:\temp\a.txt" を用意しておいてください。 //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // ファイル名を設定 AnsiString fileName = "c:\\temp\\a.txt"; // 書き換えたい位置 int pos = 3; // 書き換えるヘッダー BYTE str[3] = {'a','b','c'}; TMemoryStream *memStream = new TMemoryStream; //ファイルをストリームに読み込み memStream->LoadFromFile(fileName); //ストリームのポジションを移動 memStream->Position = pos; //ストリームの中身を書き換え memStream->Write(str, sizeof(str)); //書き換えたストリームをファイルに出力 memStream->SaveToFile(fileName); //ストリームオブジェクトの破棄 delete memStream; } //------------------------------------------------------------------- |