質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

6回答

3803閲覧

セーブデータなどファイルに保存するときバイナリで保存しない方がいいですか

piced

総合スコア60

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2021/10/09 14:55

#状況と目的
ゲーム開発をしているのですが、セーブデータや設定情報、
他にキーフレームアニメーションのデータなどを保存しようとしています。
#試したこと
fopenの"wb"と"rb"で書き込み読み込みをしていたのですが、
セーブデータや設定情報などのクラスを更新したり、リビルドがかかると、
バイナリデータを正しく読み込めなくなりました。

fopenの"r"や"w"を使えばいいのではと思いましたが、
保存したファイルを見たとき1行ごとにパラメータがズラーっと並んでおり、
ファイルの入出力に関して疎い私は、
なんだか正しいやり方ではない気がしてなりません。

#質問
1:
ゲームのセーブデータのような、度々更新がかかるクラスのデータを
ファイルに保存するときバイナリで保存しない方がいいですか?

2:
あるゲームの内部データを見ていたら、添付のコードのような
txt形式でデータを保存していました。
このような保存の仕方はどのようにやればよいですか?

3:
windows環境専用のfopenなどではなく、
環境に依存しないファイル操作の関数とか手法はありますか?

4:
セーブデータなどのファイルの入出力にあたって、
「こうするといい」みたいなアドバイスとか注意点はありますか。

###添付のコード

//save.txt "Save Data" { "version number" { "success" "4" } "Player" { "hp" "200" "item" "192" } "Tutorial" { "complete" "3" "type" "6" } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

セーブデータのフォーマットさえかっちりと定義できて、開発が進んでもその定義で最後まで行ける、あるいは拡張可能なようにフォーマットを定義できるなら、バイナリでも構わないと思います。バイナリにはバイナリの利点があります。コンパクトにできるとか入出力も高速にできるとか。

そのへんが心もとない、あるいはいつでもさらに柔軟に拡張や変更ができるようにということを考えると、テキストのフォーマットに分があります。

添付のコードはどういうフォーマットなのかはわかりかねますが、似たような汎用フォーマットにJSONというものがあります。

JavaScript Object Notation - Wikipedia

独自のフォーマットを決めてもいいと思いますが、このような汎用フォーマットを採用するのも何かとメリットがあると思います。

C++でJSONを扱うライブラリがいろいろあるようですので、ライセンス条件とか使いやすさとか環境に依存しなさそうなのとかを考えて選んでみてはいかがでしょうか。

c++ json - Google 検索

投稿2021/10/09 15:28

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

保存するデータのフォーマットをきちんと決めて、どんな環境でもそのとおりにきちんと読み書きできるようにすればバイナリでも構いません。
ましかし、バイナリではそれを見ただけでは分かりづらいんで、それなりに経験を積むまではテキストで保存したほうがわかりやすいでしょう

windows環境専用のfopenなどではなく、

環境に依存しないファイル操作の関数とか手法はありますか?

fopenやopenで素のファイル操作を行うのが環境依存しません
言語の中には、CSVの操作関数や、JSON形式のファイルの操作関数を実装してるものがありますが、そういう便利関数はその言語/ライブラリでしか使えない、ってのが多いです

投稿2021/10/09 22:31

編集2021/10/09 23:32
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

1: ゲームのセーブデータのような、度々更新がかかるクラスのデータを

更新の頻度より、まずはデータサイズ。何十メガとかありますか? そうで無ければ、テキスト/バイナリは関係ありません。

2: あるゲームの内部データを見ていたら、

独自形式じゃないでしょうか。既に指摘があるように、類似のJSONとかが近いし、便利でしょう。

3: windows環境専用のfopenなどではなく、

C/C++ では標準的です。使い方の問題。

4: セーブデータなどのファイルの入出力にあたって、

こちらも指摘はありますが、データがユーザに見えて良いのか、どうか。読み書きの速度は、データサイズに依存しますが、Mbyte単位のデータをミリ秒単位で更新するのならば、要検討ですが、関係なさそうですね。
考える必要があるのは、データがユーザーに見えて良いのか? 困るならば、バイナリで、更に秘匿する必要があれば、暗号化とか、、。
完成後にもデータの構成が変わる可能性があるならば、テキスト形式にした方が、対応は容易。バイナリ形式でもバージョン番号付加である程度は可能(と言っても結構、面倒)ですが、テキスト形式(例えば、JSONとか、XML形式など)では、不要項目読み飛ばしとか、追加も容易。

保存する目的を明確にしましょう。

投稿2021/10/10 06:11

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

開発中の段階なのであれば,

  • データの種類が変わったり個数が増減したり等々があり得そう
  • セーブデータであれば,動作テストのために「特定の状態のデータ」を用意したいようなこともありそう

…に思うので,
既存データファイル側を手作業で修正するとか,手作業で新規作成するとか,そういったことが簡単なものを用いるのが楽なのではないかと思えます.
そういった点を考えると, テキスト>バイナリ かな,と思えます.

セーブデータみたいなのをバイナリにしたいのだとしても,それはほぼ完成状態になったときに実装すればよいのではないでしょうか.

投稿2021/10/10 04:00

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

セーブデータなどのファイルの入出力にあたって、

「こうするといい」みたいなアドバイスとか注意点はありますか。

radianさんの回答にもあげられているC++のcerealのシリアライズが快適すぎるやばいにも記載がありますが、データ内容が将来変わる可能性があれば、それに対応する必要があります。

たとえば以下のようなことが考えられます。

  • データが増える(座標が2→3次元に)
  • データが減る(座標が3→2次元に)
  • データの意味が変わる(角度の単位が度からラジアンに)

具体的には保存データにバージョン番号のようなものを持たせておきます。
読み込み時には、保存されたバージョン番号に従って、現在の内容に沿ったコンバートする必要があります。
書き込み時には、一般的には常に最新の内容でよいので、そのまま書き込めばよいでしょう。

投稿2021/10/10 01:52

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JSONやXMLのような汎用的なテキストフォーマット、SQLiteのようなデータベースを採用すれば、大体の開発言語で標準サポートされていたり、ライブラリが存在するので、環境が変わってもある程度汎用性は持たせられると思います。
あとは、何らかのシリアライズライブラリを活用すれば、出力と復元は容易になると思います。
C++のcerealのシリアライズが快適すぎるやばい

テキストだと、人の目で読みやすいけれど、改ざんもしやすいという問題はあるので、そのへんも気にするのであれば、チェックサムを出力したり、暗号化をしたり別に何らかの対策が必要かもしれません。

投稿2021/10/09 23:56

編集2021/10/10 00:07
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問