ページ 11

外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 20:19
by 名前なし
外部ファイルの読み込みについて質問です。
マップの切り替えで以下のように、まず一度マップデータが記入されているテキストをchar*型配列に代入し、マップを切り替えるタイミングでLoad_Stage()でファイルを開きマップデータを配列に入れています。しかしこれだとマップが100個追加となってしまうと、stage配列を以下に100個追加で書かなければいけません。うまくfor文など使ってstage配列に入れるところを一行でまとめることはできないでしょうか。でしょうか?お願いします。
void MAP::Stage_Data()
{
stage[0]="STAGE\\stage_1.txt";
stage[1]="STAGE\\stage_2.txt";
stage[2]="STAGE\\stage_3.txt";
stage[3]="STAGE\\stage_4.txt";
stage[4]="STAGE\\stage_5.txt";
stage[5]="STAGE\\stage_6.txt";
stage[6]="STAGE\\stage_7.txt";
stage[7]="STAGE\\stage_8.txt";
stage[8]="STAGE\\stage_9.txt";
stage[9]="STAGE\\stage_10.txt";
}

//ステージの読み込み
void MAP::Load_Stage()
{
fp=NULL;

char tmp='0';


File_Load(stage[stage_scene]);

if(fp==NULL)
{
int cr= GetColor(0,0,0);

MessageBox(0,"fp=NULL","",MB_OK);
}

//fileが最後まで読み込まれるまでtmpにfileの情報を一文字ずついれる
else
{
while((tmp=fgetc(fp))!=EOF)
{
if(tmp=='5')
{
MAX_COIN++;
}
if((tmp >= '0'&&tmp<='7')||tmp=='t'||tmp=='e')//tmpが0~5ならば
{

cell->Initialize(tmp);

}
}

fclose(fp);
}
}

void MAP::File_Load(char *file)
{
fopen_s((&fp),file,"r");
}

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 20:45
by 名前もパスも忘れた

コード:

const int STAGE_MAX = /*mapデータの最大数*/
void MAP::Stage_Data()
{
	char* str;
	for(int i=0;i<STAGE_MAX;i++)
	{
		sprintf(str, "STAGE\\stage_%d.txt", i+1);
		stage[i] = str;
	}
}
おそらくこんな感じかと

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 20:54
by Idra
ファイルをロードするタイミングでstage_sceneからファイル名を作成すれば
stage配列は不要になりそう

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:03
by 名前なし
sprintfという関数を調べたところ関数事態はしたいことが実現できそうなのですが、上記のsprintfを実装し、実行したところ
0x004ca03e でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcdcd に書き込み中にアクセス違反が発生しました。
などと、エラー窓が出ていまいました。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:19
by 名前もパスも忘れた
そもそもこのstage_sceneって何なのかわからん。
もうちょっと詳しく書いたほうがいいね。

ここからエスパーなんだけど、おそらく、このstage_sceneは整数型でかつ、クラスのプロパティか、グローバル変数でステージ番号を管理してるのかな?
もし、別の場所でそのステージ番号を用いて何らかの処理をさせていないなら、Idraさんの言うとおり、文字列型にしてしまって、そのまま直にロードできると思う。

>0x004ca03e でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcdcd に書き込み中にアクセス違反が発生しました。
>などと、エラー窓が出ていまいました。

上の記述そのままは無理よ。
ちゃんとしてない書き方だからね。というか、その辺を上のコードみて、このままじゃおかしいって思わないなら
もう一度ポインタの勉強したほうがいいかも

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:21
by softya(ソフト屋)
C++ですので、sstreamクラスは使わないのでしょうか?
あと名前をちゃんとつけるという掲示板のルールになっておりますのでよろしくお願いします。
http://dixq.net/board/board.html

【補足】
Idraさんの言われる通りで、配列は不要なのではないでしょうか?

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:25
by 名前なし
stage_sceneはint型のグローバル変数でステージを切り替えるタイミングで毎回、stage_sceneに+1してからLoad_Stage()を読んでいます。

上のままではだめだったんですか・・・・。実際ポインタの知識について曖昧なところはあります><ポインタのどの辺勉強すればよろしいでしょうか??

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:28
by C++見習い
>>softya

すいませんでした><。以後気をつけます。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:30
by 名前もパスも忘れた
アカウント作ったけど、ユーザー名のとおり、パスも名前もわすれてしまったwww

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:31
by softya(ソフト屋)
名前なし さんが書きました:stage_sceneはint型のグローバル変数でステージを切り替えるタイミングで毎回、stage_sceneに+1してからLoad_Stage()を読んでいます。

上のままではだめだったんですか・・・・。実際ポインタの知識について曖昧なところはあります><ポインタのどの辺勉強すればよろしいでしょうか??
ポインタ全般ですね。最初の肝心の部分が分かっていないと思います。
部分も全部もなくて、全部わからないととんでも無いことになります。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:32
by softya(ソフト屋)
名前もパスも忘れた さんが書きました:アカウント作ったけど、ユーザー名のとおり、パスも名前もわすれてしまったwww
別にもうひとつ作ってもらっても問題ありませんので如何でしょうか。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 21:48
by C++見習い
softya(ソフト屋) さんが書きました:
名前なし さんが書きました:quote]

ポインタ全般ですね。最初の肝心の部分が分かっていないと思います。
部分も全部もなくて、全部わからないととんでも無いことになります。

全般ですか。もう一回勉強しなおします。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 22:03
by softya(ソフト屋)
C++らしい作りで作る方向性を目指すのか、C言語にC++っぽさを加えた程度で完成を目指すのか決められたほうが良いと思います。
ちなみに前者は難易度が高くなります。現状は後者の作り方です。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 22:12
by ミラ(旧名前パス忘れたさん
ポインタをしっかり理解するまではCでいいかとおもいます。
ちなみにさっきのランタイムエラーは実体のないポインタに文字列代入しようとして
OS「お前どこに代入してんだよ、そこ書き込み許可だしてねーから」ってことですね。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 22:23
by c++
ミラ(旧名前パス忘れたさん さんが書きました:ポインタをしっかり理解するまではCでいいかとおもいます。
ちなみにさっきのランタイムエラーは実体のないポインタに文字列代入しようとして
OS「お前どこに代入してんだよ、そこ書き込み許可だしてねーから」ってことですね。
エラーの原因はそういう意味だったんだですか!ポインタを理解していないと今回のは自分で解決するのは難しそうですね。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 22:28
by softya(ソフト屋)
名前を統一して固定をお願いします。
一貫して「C++見習い」にするか、もっとちゃんとした名前をお願いします。
一度固定した名前を変更することは混乱をもたらすので、決して行わないで下さい。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 22:32
by C++見習い
softya(ソフト屋) さんが書きました:名前を統一して固定をお願いします。
一貫して「C++見習い」にするか、もっとちゃんとした名前をお願いします。
一度固定した名前を変更することは混乱をもたらすので、決して行わないで下さい。
すいません。記入ミス、今気づきました。
正しくは「C++」ではなく「C++見習い」です。

お手数おかけしました。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 22:58
by softya(ソフト屋)
softya(ソフト屋) さんが書きました:C++らしい作りで作る方向性を目指すのか、C言語にC++っぽさを加えた程度で完成を目指すのか決められたほうが良いと思います。
ちなみに前者は難易度が高くなります。現状は後者の作り方です。
こちらの方は結局、C言語+αで行くという方向で良いですね?

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 23:15
by C++見習い
softya(ソフト屋) さんが書きました:
softya(ソフト屋) さんが書きました: こちらの方は結局、C言語+αで行くという方向で良いですね?
現状ではC+αの段階ですが、ポインタを理解したうえで最終的にはオブジェクト指向プログラミングを目指していますのでC++です。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 23:26
by softya(ソフト屋)
C++見習い さんが書きました: 現状ではC+αの段階ですが、ポインタを理解したうえで最終的にはオブジェクト指向プログラミングを目指していますのでC++です。
と言うことはポインタなどを理解した上で、オブジェクト指向理解して最終的にグローバル変数を無くして、出来るだけポインタではなくsstreamクラスやvectorクラスなどを使ったC++らしいプログラムに組み替えると言う理解でよろしいですか。
それなら完成させた上で、全部オブジェクト指向で組み直したほうがモチベーションが持ちそうな気がします。途中で組み替えるのは、そうとう労力を使いますよ。

※ C++の言語の勉強と作品の完成を同時に目指すのは、結構危険な綱渡りです。C++の理解が足を引っ張っての挫折者が結構いますので。1から2週で作れる小さな作品の完成を積重ねていくのならGOODな方法だと思います。数ヶ月かかる作品ならBADだと思います。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 23:38
by C++見習い
softya(ソフト屋) さんが書きました:
C++見習い さんが書きました:

と言うことはポインタなどを理解した上で、オブジェクト指向理解して最終的にグローバル変数を無くして、出来るだけポインタではなくsstreamクラスやvectorクラスなどを使ったC++らしいプログラムに組み替えると言う理解でよろしいですか。
それなら完成させた上で、全部オブジェクト指向で組み直したほうがモチベーションが持ちそうな気がします。途中で組み替えるのは、そうとう労力を使いますよ。

※ C++の言語の勉強と作品の完成を同時に目指すのは、結構危険な綱渡りです。C++の理解が足を引っ張っての挫折者が結構いますので。1から2週で作れる小さな作品の完成を積重ねていくのならGOODな方法だと思います。数ヶ月かかる作品ならBADだと思います。
作品自体はすでにできていたのですが、この作品を企業に見せた際、最初のところをまとめたほうがよいとのアドバイスいただき、今回は指摘していただいた部分の修正をしていた次第です。しかし思ったより、つまずいてしまったので今回質問させていただきました。

C++らしいプログラムについてもまた、企業からオブジェクト指向は理解しておいたほうがよいとのことでした。C++についての理解は今の段階ではあまりありませんが、最終的にはC++らしいプログラミングをしたいと思っています。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 23:45
by softya(ソフト屋)
採用関係なら、こちらからは直接的な回答は避けたほうがよさそうです。
これからは勉強の方向性のアドバイスを致しますね。

この段階だとポインタの理解が、まず必要なのは間違いないと思います。
あと、企業側はどれだけ対応できるかも実力を測るために見ているのでアドバイスをもとに自力でやらないと意味が無いのです。
※ こういう掲示板を採用担当がチェックしている場合もあります。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月11日(金) 23:58
by C++見習い
softya(ソフト屋) さんが書きました:採用関係なら、こちらからは直接的な回答は避けたほうがよさそうです。
これからは勉強の方向性のアドバイスを致しますね。

この段階だとポインタの理解が、まず必要なのは間違いないと思います。
あと、企業側はどれだけ対応できるかも実力を測るために見ているのでアドバイスをもとに自力でやらないと意味が無いのです。
※ こういう掲示板を採用担当がチェックしている場合もあります。
とにかくポインタですね。こちらも質問する際は気を付けます。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月12日(土) 00:10
by softya(ソフト屋)
ちなみに、No:1で投稿されたコードでメンバ関数の分け方とか、コード自体の流れとか、引数の使い方とか不合理で不慣れな印象を受けます。
これらの整理も「最初のところをまとめたほうがよいとのアドバイス」に含まれる気がします。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月12日(土) 00:26
by C++見習い
softya(ソフト屋) さんが書きました:ちなみに、No:1で投稿されたコードでメンバ関数の分け方とか、コード自体の流れとか、引数の使い方とか不合理で不慣れな印象を受けます。
これらの整理も「最初のところをまとめたほうがよいとのアドバイス」に含まれる気がします。

今まで、作品を作るのに力を入れて、そういうところにはあまり力をいれてなかったかもしれないです。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月12日(土) 02:35
by ミラ(旧名前パス忘れたさん
何かアプリケーションを根気良く作りきるってところは、評価されてるはずだから
それ以外のことやってるときに、どういう管理のしかたがいいんだろう?とか、ここもうちょっと効率のいいアルゴリズムないかな?
とかで、ぜんぜん変わると思う

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月15日(火) 10:48
by C++見習い
すいません。長くかかりましたがsprintfの件、解決いたしました。

ご丁寧にアドバイスしていただきありがとうございました。大変勉強になりました。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月15日(火) 20:35
by softya(ソフト屋)
C++見習い さんが書きました:すいません。長くかかりましたがsprintfの件、解決いたしました。

ご丁寧にアドバイスしていただきありがとうございました。大変勉強になりました。
これもルールなのですが、どのように解決したかと出来ればソースコードも投稿して下さい。
あとから見た人の参考になる情報を残すのも掲示板の重要な役目です。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月15日(火) 21:38
by C++見習い
softya(ソフト屋) さんが書きました:
C++見習い さんが書きました:
これもルールなのですが、どのように解決したかと出来ればソースコードも投稿して下さい。
あとから見た人の参考になる情報を残すのも掲示板の重要な役目です。
すいません、以下がエラーが出ていたところです。

コード:

sprintf_s(str,30,"STAGE\\stage_%d.txt",stage_select);
sprintfより今はsorintf_sが推奨されているらしくそちらに変更いたしました。

最初つまずいたところはポインタのところで、*strを何も指していない状態で使用していたためエラーが出ていました。

コード:

str= new char[30];
のようにまず領域を確保してから使ったところ解決しました。

お騒がせしていまい申し訳ありませんでした。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月15日(火) 21:40
by C++見習い
C++見習い さんが書きました:
softya(ソフト屋) さんが書きました:
C++見習い さんが書きました:
これもルールなのですが、どのように解決したかと出来ればソースコードも投稿して下さい。
あとから見た人の参考になる情報を残すのも掲示板の重要な役目です。
すいません、以下がエラーが出ていたところです。

コード:

sprintf_s(str,30,"STAGE\\stage_%d.txt",stage_select);
sprintfより今はsorintf_sが推奨されているらしくそちらに変更いたしました。

最初つまずいたところはポインタのところで、*strを何も指していない状態で使用していたためエラーが出ていました。

コード:

str= new char[30];
のようにまず領域を確保してから使ったところ解決しました。

お騒がせしていまい申し訳ありませんでした。

sorintf_s→sprintf_s すいません。誤字訂正です。

Re: 外部ファイルの読み込みについて。

Posted: 2013年10月15日(火) 21:50
by softya(ソフト屋)
sprintf_s はマイクロソフト限定の関数なので理解して使う分には良いですがgccなど環境次第でコンパイルできません。
例えばゲーム業界だと使えない場面・状況が大半だと言うことです。