7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++でjsonファイルの読み込み/書き込みをやってみた

Last updated at Posted at 2023-04-17

概要

この記事は筆者がゲームのデータを外部ファイルで扱うためにjsonの読み込み/書き込みの方法を模索した際の記録になります。

注意
個人的に行ったもののため誤っている点があるかもしれません。参考程度になれば幸いです。

目次

1.必要なファイル
2.書き込み
3.読み込み
4.まとめ

1.必要なファイル

そのままjsonを扱おうとすると面倒くさいので、GitHubにあったライブラリを使用します。
この中にある「json.cpp」をソースコードの入っているフォルダに追加してください。

GitHub

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.まとめ

ライブラリを使用することでほとんど手間をかけずに外部ファイルを利用できるようになるので、外部ファイルからデータを取り込むようにしたい場合は活用してみてください。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?