前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

18.2. SFXFile クラス

SFXFile クラスは、ファイルストレージを表すクラスです。 ファイルの作成や、ファイルへのデータの読み書き、 ファイル属性などの情報の取得、テンポラリファイルの作成などが行えます。

ファイルストレージへのデータの読み書きは、 SFXFile クラスを使用して以下の手順で行います。

■ SFXFile クラスの使用手順

  1. SFXFile インスタンス(SFXFile ストレージ)を生成します。
  2. SFXFile::OpenReadOnly / SFXFile::OpenReadWrite 関数を呼び出して SFXFile ストレージを開きます。
  3. SFXFile::GetStreamReader / SFXFile::GetStreamWriter 関数を呼び出してストリームを取得します。
  4. ストリームを利用して SFXFile ストレージに対してデータを読み書きします。
  5. ※ストリームを利用しない場合は、SFXFile::Read / SFXFile::Write 関数を呼び出してデータを読み書きします。
  6. SFXFile::Close 関数を呼び出して SFXFile ストレージを閉じます。
[Tip] ファイルのオープンモード

ファイルのオープンモードには、読み込みモードと読み書きモードの 2 種類があります。

ファイル入力の場合は SFXFile::OpenReadOnly 関数を呼び出して 読み込みモードでファイルを開きます。

ファイル出力の場合は SFXFile::OpenReadWrite 関数を呼び出して読み書きモードでファイルを開きます。

[Note] ファイルポインタ

SFXFile クラスは、読み書き用のファイルポインタを 1 つ持ちます。 SFXFile::Read / SFXFile::Write 関数は、 ポインタの位置からデータを読み込み / 書き込み、その分ファイルポインタを移動します。

SFXFile::Seek / SFXFile::SeekStart / SFXFile::SeekEnd 関数を呼び出してファイルポインタを移動することも可能です。

また、ストリームを利用して読み書きする場合も、 読み書きしたデータ量に応じてファイルポインタは移動します。

例 18.1. ファイル入力

SFXFile file;                     // ファイル
SFXAnsiStringStreamReader reader; // ファイル読み込み用ストリーム
SFXAnsiString string;             // 読み込む変数

// 読み込みモードでファイルを開く
if ((error = file.OpenReadOnly(SFXPath("/dir/data.txt"))) == SFERR_NO_ERROR) {

    // ファイル読み込み用ストリームを取得する
    // ※ size 引数を指定していないのでストリームバッファは可変長
    if ((error = file.GetStreamReader(&reader)) == SFERR_NO_ERROR) {

        // ファイルからストリームバッファにデータを読み込む
        // ※1. 読み込んだデータのサイズに合わせてストリームバッファは自動的に拡張される
        // ※2. 可変長バッファストリームの場合、1 回の Fetch 関数呼び出しで読み込みは完了する
        if ((error = reader.Fetch()) == SFERR_NO_ERROR) { 

            // ストリームのバッファから string 変数にデータを読み込む
            if ((error = reader.ReadSFXAnsiString(&string)) == SFERR_NO_ERROR) { 

                // ファイル読み込み成功!

                // string 変数の内容をデバッグウィンドウに表示する
                TRACE("%s", string.GetCString());

            } 
        }
        // ファイル読み込み用ストリームを解放する
        reader.Release();
    }
    // ファイルを閉じる
    file.Close();
} 
if (error != SFERR_NO_ERROR) {

    // エラーが発生したとき
    ...
}
[Note] 可変長バッファストリームによる読み込み

ストリームにはバッファがあります。

SFXFile::GetStreamReader 関数で size 引数を指定せずにファイル読み込み用ストリームを取得しているので、 可変長バッファが使用されます。 このため、 ストリームバッファは入力ファイルと同じサイズまで拡張されます。

SFXStreamReader::Fetch 関数は、 ファイルからデータを読み込み、ストリームバッファに読み込みます。

SFXAnsiStringStreamReader::ReadSFXAnsiString 関数は、 ストリームバッファからデータを読み込み、string 変数に格納します。

[Note] データを複数セグメントに分割して読み込む方法

固定長バッファを使うストリームを参照してください。

例 18.2. ファイル出力

SFXFile file;                     // ファイル
SFXAnsiStringStreamWriter writer; // ファイル書き込み用ストリーム
SFXAnsiString string("abcdefg");  // 書き込む変数

// 読み書きモードでファイルを開く
if ((error = file.OpenReadWrite(SFXPath("/dir/data.txt"))) == SFERR_NO_ERROR) {

    // ファイル書き込み用ストリームを取得する
    // ※ size 引数を指定していないのでストリームバッファは可変長
    if ((error = file.GetStreamWriter(&writer)) == SFERR_NO_ERROR) {

        // string 変数からストリームバッファにデータを書き込む
        // ※ 書き込んだデータのサイズに合わせてストリームバッファは自動的に拡張される
        if ((error = writer.WriteSFXAnsiString(string)) == SFERR_NO_ERROR) {

            // ストリームバッファのデータをファイルにデータを書き込む
            // ※ 可変長バッファストリームの場合、1 回の Flush 関数呼び出しで書き込みは完了する
            error = writer.Flush(); 
        } 
        // ファイル書き込み用ストリームを解放する
        writer.Release();
    } 
    // ファイルを閉じる
    file.Close();
} 
if (error != SFERR_NO_ERROR) {

    // エラーが発生したとき
    ...
}
[Note] 可変長バッファストリームによる書き込み

ストリームにはバッファがあります。

SFXFile::GetStreamWriter 関数で size 引数を指定せずにファイル書き込み用ストリームを取得しているので、 可変長バッファが使用されます。 このため、 ストリームバッファは出力ファイルに書き込む全データと同じサイズまで拡張されます。

SFXAnsiStringStreamWriter::WriteSFXAnsiString 関数は、 string 変数のデータをストリームバッファに書き込みます。

SFXStreamWriter::Flush 関数は、 ストリームバッファ内のデータをファイルに書き込みます。

[Caution] フラッシュしないとき

Flush 関数を呼び出さずにファイルを閉じると、データはファイルに書き込まれません。

[Note] データを複数セグメントに分割して書き込む方法

固定長バッファを使うストリームを参照してください。