-
Notifications
You must be signed in to change notification settings - Fork 1
バイナリファイル
Reputeless edited this page Jul 14, 2016
·
2 revisions
バイナリファイル は、データをテキストではなく バイナリデータ で扱います。
例えば 123 という int
型の数値は、L"123"
という 3 文字(NULL 終端を含めると 8 バイト) の文字列ではなく、00000000000000000000000001111011
というビット列で表される 4 バイトのデータとして扱います。
データをファイルに保存する際、テキスト形式で保存すると、テキストから数値、数値からテキストへの変換にコストがかかり、必要なサイズも大きくなります。一方、バイナリデータとして扱えば変換のコストはかかりませんし、最小限のデータサイズしか必要としません。
int
や double
型などのプリミティブ型や、プリミティブ型で構成された trivially copyable なクラス (Point
, Vec2
, Rect
, Color
) などは容易にバイナリデータとして扱えますが、Array
や String
など、ポインタで内部データを管理するデータ型をバイナリデータとして扱うのには苦労が伴います。シリアライズ機能 を使うと、Array
や String
, その他いくつかの Siv3D の trivially copyable でないクラスをバイナリデータとして扱えるようになります。独自に定義した型をシリアライズに対応させることもできます。
# include <Siv3D.hpp>
struct Something
{
int32 a, b, c, d;
};
void Main()
{
const Something s = { 10, 20, 30, 40 };
BinaryWriter writer(L"Tutorial-Binary.bin");
// 4 バイト
writer.write(12345);
// 8 バイト
writer.write(3.1415);
// 16 バイト
writer.write(s);
}
# include <Siv3D.hpp>
struct Something
{
int32 a, b, c, d;
};
void Main()
{
// 書き込みのサンプルで作成したファイル
BinaryReader reader(L"Tutorial-Binary.bin");
int32 n;
double f;
Something s;
reader.read(n);
reader.read(f);
reader.read(s);
Println(n);
Println(f);
Println(s.d);
WaitKey();
}
# include <Siv3D.hpp>
void Main()
{
// 書き込みのサンプルで作成したファイル
BinaryReader reader(L"Tutorial-Binary.bin");
reader.setPos(24);
int32 d;
reader.read(d);
Println(d);
WaitKey();
}
# include <Siv3D.hpp>
void Main()
{
const String s = L"Siv3D Engine";
const uint64 length = s.length;
BinaryWriter writer(L"Tutorial-Binary.bin");
writer.write(length);
writer.write(s.data(), length * sizeof(wchar));
writer.close();
BinaryReader reader(L"Tutorial-Binary.bin");
String s2;
size_t length2 = 0;
reader.read(length2);
s2.resize(length2);
reader.read(&s2[0], s2.length * sizeof(wchar));
Println(s2);
WaitKey();
}
# include <Siv3D.hpp>
void Main()
{
const String s = L"Siv3D Engine";
Serializer<BinaryWriter> writer(L"Tutorial-Serializer.bin");
writer(s);
writer.getWriter().close();
Deserializer<BinaryReader> reader(L"Tutorial-Serializer.bin");
String s2;
reader(s2);
Println(s2);
WaitKey();
}
# include <Siv3D.hpp>
struct Monster
{
String name;
int32 id;
double size;
// このようなメンバ関数を定義する
template <class Archive>
void serialize(Archive& archive)
{
archive(name, id, size);
}
};
void Main()
{
const Monster monster = { L"Goblin", 123, 1.2 };
Serializer<BinaryWriter> writer(L"Tutorial-Serializer.bin");
writer(monster);
writer.getWriter().close();
Deserializer<BinaryReader> reader(L"Tutorial-Serializer.bin");
Monster m;
reader(m);
Println(m.name);
Println(m.id);
Println(m.size);
WaitKey();
}
- Siv3D の基本
- 図形を描く
- テクスチャを描く
- テキストを描く
- 文字列と数値の変換
- キーボード入力
- マウス入力
- サウンドの再生
- MIDI の再生
- ウィンドウと背景
- 図形のあたり判定
- 乱数
- ダイアログ
- ドラッグ & ドロップ
- アプリの状態
- テキストファイル
- INI, CSV, JSON
- バイナリファイル
- GUI
- アセット管理
- 画像編集
- Web カメラ
- マイク入力
- 経過時間の測定
- HSV カラー
- ファイルダウンロード
- 3D 描画
- 2D のレンダーステート
- 3D のレンダーステート
- パーティクル
- スクリーンショット
- アプリケーションの公開
- さらに学ぶには
- アプリランチャーを作ろう
- 音楽プレイヤーを作ろう
- 横スクロールゲームを作ろう
- ドット絵エディタを作ろう
- シーン遷移をサポートする SceneManager の使い方
- Siv3D ミニサンプル集
- タスクシステムを使う
- スケッチ
- 画像ビューアー
- オーディオスペクトラム
- マイク入力スペクトラム
- 文字色の反転
- 天気予報
- ドットお絵かき
- 15パズル
- ブロックくずし
- 時計
- 音楽プレイヤー
- ピアノ
- ライフゲーム
- シーン管理
- 地球
- 3Dシーン
- 3D交差判定
- Wooden Mirror
- シューティングゲーム
- Image to Polygon
- Sketch to Polygon
- 軌跡
- Plot3D
- テンポとピッチの変更
- 長方形の影
- Twitterクライアント
- Polygon to Mesh
- 3Dテキスト
- アプリ終了の確認
- 地形の生成
- アーカイブファイル
- GUIのアニメーション
- Aero Glassエフェクト
- Glitch
- リンクテキスト
- 付箋
- シーン切り替え(シルエット)
- MIDIシーケンサー
- 数つなぎ
- 画面を揺らす
- 対称定規
- aobench
- MIDIビジュアライザー
- 電卓
- 手書き文字認識
- 顔検出
- 音声合成
- Image to PhysicsBody