概要
この記事は筆者がゲームのデータを外部ファイルで扱うためにjsonの読み込み/書き込みの方法を模索した際の記録になります。
注意
個人的に行ったもののため誤っている点があるかもしれません。参考程度になれば幸いです。
目次
1.必要なファイル
2.書き込み
3.読み込み
4.まとめ
1.必要なファイル
そのままjsonを扱おうとすると面倒くさいので、GitHubにあったライブラリを使用します。
この中にある「json.cpp」をソースコードの入っているフォルダに追加してください。
2.書き込み
json型のオブジェクトを作成
まずはjson型のオブジェクトを作成します。(json.cppを使うことで作成できるようになります)
/*
iostream:実行画面上に文字を表示したり文字を入力するのに必要
json.hpp:jsonの作成読み込みを楽にしてくれる
fstream:ファイルの読み込みや書き込みに必要
*/
#include <iostream>
#include "json.hpp"
#include <fstream>
//書き込むjsonファイルの内容を書く
json m_json = {
{"Name","Normal"},
{"Speed",2.5f},
{"Firingangle",0.0f}
};
作成したオブジェクトを外部ファイルに書き込む
作成したデータを外部ファイルに書き込みます。
//ここでファイルを作成
string filename = m_json["Name"];
string Extension = ".json";
filename += Extension;
//作成したファイルに内容を書き込む
ofstream writing_file;
writing_file.open(filename, ios::out);
writing_file << m_json.dump() << endl;
writing_file.close();
json型のファイルはそのままでは書き込めないため、シリアライズを行います
m_json.dunp()
これだけでシリアライズを行うことが出来ます。
シリアライズとは
シリアライズとは、複数の要素を一列に並べる操作や処理のこと。単にシリアライズといった場合には、プログラムの実行状態や複雑なデータ構造などを一つの文字列やバイト列で表現する「直列化」を指すことが多い。(IT用語辞典引用)
IT用語辞典引用元
https://e-words.jp/w/%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%A9%E3%82%A4%E3%82%BA.html
以上でファイルの書き込みが完了し、ソリューション直下にjsonファイルが作成されます。
(このプログラムの場合、jsonオブジェクト内のnameのデータをそのままファイル名としています。)
3.読み込み
書き込みが行えたので今度は読み込みを行います。
試しに先ほど作成した「Normal.json」を読み込んでみます。
//読み込むファイルの名前を作成
string filename = "Normal.json";
//ファイルを読み込んで内容を画面に表示する
//読み込みに失敗した場合はエラーを表示する
ifstream ifs(filename.c_str());
if (ifs.good())
{
json m_json;
ifs >> m_json
//読み込んだデータをそれぞれの変数に代入する
string name = m_json["Name"];
float speed = m_json["Speed"];
float firingangle = m_json["Firingangle"];
//代入されたデータを表示する
cout << "Name:" << name << endl;
cout << "Speed:" << speed << endl;
cout << "Firingangle:" << firingangle << endl;
}
else
{
cout << "ファイルの読み込みに失敗しました" << endl;
}
Name:Normal
Speed:2.5
Firingangle:0
上記の様に読み込んだデータが表示されます。
ファイル名を入力できるようにする
複数のファイルがソリューション直下に入っていても使えるようにファイル名を入力できるようにすると使いやすいと思います。
//読み込むファイルの名前を入力する(拡張子は不要)
string filename;
cout << "ファイル名を入力してください" << endl;
cin >> filename;
string Extension = ".json";
filename += Extension;
4.まとめ
ライブラリを使用することでほとんど手間をかけずに外部ファイルを利用できるようになるので、外部ファイルからデータを取り込むようにしたい場合は活用してみてください。