ページ 11

ifstream文を使った3次元配列の読み込み

Posted: 2016年7月25日(月) 23:27
by アキノ
度々お世話になります。
作成しているローグライクRPGで、
ダンジョンマップの描画等に使う3次元配列データを今まではソースコード内で宣言していたのですが、
ファイルから読み取って出力するようにしたいです。
自分で調べた結果ifstream文を使うということまではわかったのですが、3次元配列をどう読み込めばよいのかがわかりません。
以下の様な配列を、ファイル名[map.txt] から読み取る場合、どの様にソースを書けばよいのでしょうか。
具体的に教えていただきたいです。よろしくお願いします。
コンパイラは、CPad for borlandです。

コード:

char danjon[2][10][10] ={{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 0, 1, 0, 1, 1, 1, 1, 0, 1},
						  {1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
						  {1, 0, 1, 1, 1, 0, 1, 0, 0, 1},
						  {1, 0, 0, 1, 0, 0, 0, 0, 0, 1},
						  {1, 1, 2, 1, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 1, 0, 0, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}},
						  
						 {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 2, 1},
						  {1, 0, 1, 0, 1, 0, 1, 0, 1, 1},
						  {1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
						  {1, 0, 1, 0, 0, 0, 1, 1, 0, 1},
						  {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 0, 0, 1},
						  {1, 0, 1, 0, 0, 1, 0, 1, 0, 1},
						  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
						  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}};

Re: ifstream文を使った3次元配列の読み込み

Posted: 2016年7月25日(月) 23:56
by みけCAT
このような大きな配列をそのファイル名から読み取るのは、不可能と考えていいでしょう。
配列のデータをファイルから読み取る方法は、そのファイルのフォーマットに依存します。
アキノ さんが書きました:コンパイラは、CPad for borlandです。
本当ですか?
それはコンパイラではなくエディタではないのですか?

Re: ifstream文を使った3次元配列の読み込み

Posted: 2016年7月26日(火) 00:17
by アキノ
ありがとうございます。
では、どのようなフォーマットであれば主題の様な3次元配列を読み込めるのでしょうか…。

すみません。コンパイラとエディタの違いを理解していませんでした。
勉強不足でお恥ずかしい限りです。

Re: ifstream文を使った3次元配列の読み込み

Posted: 2016年7月26日(火) 03:19
by かずま
アキノ さんが書きました: 自分で調べた結果ifstream文を使うということまではわかったのですが、3次元配列をどう読み込めばよいのかがわかりません。
以下の様な配列を、ファイル名[map.txt] から読み取る場合、どの様にソースを書けばよいのでしょうか。
具体的に教えていただきたいです。よろしくお願いします。
char の 3次元配列ですが、ファイルの読み書きは int で行うものとすれば、

コード:

#include <iostream>
#include <fstream>

using namespace std;
 
char dungeon[2][10][10];

int main()
{
    ifstream ifs("map.txt");
    if (!ifs) return 1;
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 10; j++)
            for (int k = 0; k < 10; k++) {
                int n;
                ifs >> n;
                dungeon[i][j][k] = n;
            }
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 10; j++) {
            for (int k = 0; k < 10; k++)
                cout << ' ' << (int)dungeon[i][j][k];
            cout << endl;
        }
        cout << endl;
    }
}
map.txt

コード:

1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 1
1 0 1 0 1 1 1 1 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 1 1 0 1 0 0 1
1 0 0 1 0 0 0 0 0 1
1 1 2 1 0 1 0 0 0 1
1 0 1 1 0 0 0 1 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1
1 0 1 0 0 0 1 0 2 1
1 0 1 0 1 0 1 0 1 1
1 0 1 0 0 0 1 0 0 1
1 0 1 0 0 0 1 1 0 1
1 0 1 0 0 0 0 1 0 1
1 0 1 0 0 1 0 0 0 1
1 0 1 0 0 1 0 1 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

Re: ifstream文を使った3次元配列の読み込み

Posted: 2016年7月27日(水) 07:20
by アキノ
かずまさんありがとうございます。
配列を宣言出来れば良いので、表示までは大丈夫でした。
とりあえずはかずまさんのやり方でやってみようかと思います。

Re: ifstream文を使った3次元配列の読み込み

Posted: 2016年7月27日(水) 16:57
by かずま
アキノ さんが書きました:配列を宣言出来れば良いので、表示までは大丈夫でした。
どういう意味でしょうか?
宣言は最初の質問の時からできていますよね。
表示までは何が大丈夫なのですか?
表示のあとは大丈夫ではないのですか?

次のプログラムでも、全く同じ結果が表示されますが、
dungeon[j][k] に入る値は前のプログラムとは異なります。
何が違うのか、説明できますか?

コード:

#include <iostream>
#include <fstream>
 
using namespace std;
 
char dungeon[2][10][10];
 
int main()
{
    ifstream ifs("map.txt");
    if (!ifs) return 1;
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 10; j++)
            for (int k = 0; k < 10; k++)
                ifs >> dungeon[i][j][k];

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 10; j++) {
            for (int k = 0; k < 10; k++)
                cout << ' ' << dungeon[i][j][k];
            cout << endl;
        }
        cout << endl;
    }
}