![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0 |
メモリをストリームで操作するには、SFXMemory クラスを使います。
例 19.35. ファイルからメモリへの読み込み
SFCError error; // エラー値 SFXFile file; // 入力ファイル SFXBinaryStreamReader reader; // ファイル読み込み用ストリーム SFXMemory memory; // メモリ ストレージ SFXBinaryStreamWriter writer; // メモリ書き込み用ストリーム UInt08 c; // ファイルをオープンする if ((error = file.OpenReadOnly(SFXPath("/dir1/data.txt"))) == SFERR_NO_ERROR) { // ファイル読み込み用ストリームを取得する if ((error = file.GetStreamReader(1024, &reader)) == SFERR_NO_ERROR) { // メモリ ストレージをオープンする if ((error = memory.Open()) == SFERR_NO_ERROR) { // メモリ書き込み用ストリームを取得する if ((error = memory.GetStreamWriter(1024, &writer)) == SFERR_NO_ERROR) { // ファイル読み込み用ストリームのバッファから読み込む if ((error = reader.Fetch()) == SFERR_NO_ERROR) { // ファイル読み込み用ストリームの終端まで繰り返す while (error == SFERR_NO_ERROR & !reader.Ends()) { // ファイル読み込み用ストリームのバッファにデータがあるとき if (reader.GetReadableSize() > 0) { // ファイル読み込み用ストリームからデータを 1 バイト読み込む reader > c; if (c != '\r' & c != '\n') { // 改行文字でなければ // メモリ書き込み用ストリームに書き込む writer < c; } } else { // ファイル読み込み用ストリームのバッファにデータがないとき error = reader.Fetch(); } if (error == SFERR_NO_ERROR) { if (writer.GetWritableSize() == 0) { // メモリ書き込み用ストリームのバッファに空きがないとき error = writer.Flush(); } } } if (error == SFERR_NO_ERROR) { // 終端の '\0' を書き込む writer < static_cast<UInt08>('\0'); if ((error = writer.Flush()) == SFERR_NO_ERROR) { // 書き込んだデータへのポインターを取得してデータを表示する TRACE("%s", memory.GetBuffer()); // 結果を buffer 変数に格納する SFXBuffer buffer; error = memory.Close(&buffer); } } } } writer.Release(); } reader.Release(); } file.Close(); }
BREW ISource のデータをストリームで操作するには、SFXSource クラスを使います。
例 19.36. HTTP 通信で画像をダウンロードし、SFBImage として扱う方法
// 接続処理のコードは省略 // HTTP 接続が確立されたときに呼び出されるコールバック関数 CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(MyClass, OnConnect, error) { SFBSourceSmp source; SFXSource temp; if (error == SFERR_NO_ERROR) { if (_http.GetResultCode() == 200) { // コンテント部分を管理する SFBSourceSmp クラスを取得する if ((source = _http.GetResponseContent()) != null) { // SFBSourceSmp から SFXStorage への変換 // コンテント部分のデータの管理権限は SFXHTTPConnection クラスに // あるので SFXSource クラスはすぐに破棄しても良い if (temp.Open(source) == SFERR_NO_ERROR) { if (_image.SetStorage(temp) == SFERR_NO_ERROR) { // SFXSource クラスを SFBImage クラスに設定する } } } } } return; }
gzip ファイルをストリームで解凍するには、SFXZIPDecoder クラスを使います。
例 19.37. gzip ファイルの解凍
// コールバック関数で使うので、SFXZIPDecoder のインスタンスはクラスのメンバ変数にする class MyClass { private: SFXFile _file; // 入力ファイル SFXZIPDecoder _decoder; // gzip デコーダー SFXAnsiStringStreamReader _reader; // 読み込み用ストリーム SFXAnsiString _unzipString; // 解凍後の文字列 public: Void Start(Void); // コールバック関数 CALLBACK_DECLARE_SFXANSISTRINGSTREAMREADER(OnFetch) }; Void MyClass::Start(Void) { SFCError error; // エラー // 読み込みモードでファイルをオープンする if ((error = _file.OpenReadOnly(SFXPath("/testdata.tar.gz"))) == SFERR_NO_ERROR) { // ファイル ストレージを gzip デコーダに登録する if ((error = _decoder.Open(_file)) == SFERR_NO_ERROR) { // gzip デコーダから読み込み用ストリームを取得する if ((error = _decoder.GetStreamReader(&_reader)) == SFERR_NO_ERROR) { // データを読み込む( データ読み込みの完了は、OnFetch 関数に通知される) if ((error = _reader.Fetch(CALLBACK_FUNCTION(OnFetch))) != SFERR_NO_ERROR) { // エラーが発生したとき _reader.Release(); } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _decoder.Close(); } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _file.Close(); } } } // データ読み込みの完了が通知されるコールバック関数 CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(MyClass, OnFetch, error) { if (error == SFERR_NO_ERROR) { // エラーが発生していないとき // 解凍したデータを _unzipString 変数に読み込む if ((error = _reader.ReadSFXAnsiString(&_unzipString)) == SFERR_NO_ERROR) { // 文字列を表示する TRACE("%s", _unzipString.GetCString()); } } // 終了処理 _decoder.Close(); _file.Close(); }
|
Copyright (C) 2002 - 2008 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|