ページ 11

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

Posted: 2015年3月22日(日) 21:02
by しー
C++でDXLibを用いてtxtファイルの中身(すべて半角数字)を読み込み
一文字づつ配列に入れるプログラムをつくっています。
ビルドは成功しているのですが、ウィンドウは表示されますが読み込み中?(カーソルがくるくるしてる)ままで、画面は真っ暗で動きません
アドバイスお願いします((+_+))

↓のプログラムでは、txtファイルの中身を一文字づつhumen.kndに入っているのか確かめるために
最初のなんこか表示させてみようとおもいました。

コード:

#include "../include/DXlib.h"

typedef struct{
	int flag;
	int cnt;
	int knd;
}Humen;

Humen humen[1000];

void load_humen(){
	int fp, i = 0, cnt = 0;
	fp = FileRead_open(".. / file / lism / txt");

	if (fp == NULL) DrawString(5, 5, "error", GetColor(255, 255, 255));

	while (1){
		humen[i].knd = FileRead_getc(fp);
		if (humen[i].knd != ' ' && humen[i].knd != '\n')
			if (humen[i].knd != 0){
				humen[i].flag = 1;
				humen[i].cnt = cnt;
				cnt++;
			}
		DrawFormatString(5, 5, GetColor(255, 255, 255), "knd=%d, flag=%d, cnt=%d", humen[i].knd, humen[i].flag, humen[i].cnt);
		i++;
		if (humen[i].knd == EOF) break;
	}
	FileRead_close(fp);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

	ChangeWindowMode(TRUE);//ウィンドウモード
	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化

	if (DxLib_Init() == -1)    // DXライブラリ初期化処理
	{
		return -1;    // エラーが起きたら直ちに終了
	}

	load_humen();

	while (CheckHitKeyAll() == 0)
	{
		DrawFormatString(5, 5, GetColor(255, 255, 255), "0 = %d", humen[0].knd);
		DrawFormatString(5, 15, GetColor(255, 255, 255), "1 = %d", humen[1].knd);
		DrawFormatString(5, 25, GetColor(255, 255, 255), "2 = %d", humen[2].knd);
	}
	DxLib_End();

	return 0;
}



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

Posted: 2015年3月22日(日) 21:09
by amehirune
しー さんが書きました:

コード:

		DrawFormatString(5, 5, GetColor(255, 255, 255), "knd=%d, flag=%d, cnt=%d", humen[i].knd, humen[i].flag, humen[i].cnt);
		i++;
		if (humen[i].knd == EOF) break;
	}
	FileRead_close(fp);
とりあえず気になった点を1つ。
i++;を実行した後にEOF判定を行っております。
これだと、まだhuman.kndは何も格納されておらず、中身が空(初期値は原則0だっけ?)であるはずです。
つまり、EOF判定は常に偽、無限ループに陥るわけです。
順番を変えてみてください。
オフトピック
…というか、EOF判定はこっちを使った方が早いような…?

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

Posted: 2015年3月22日(日) 21:44
by box
そもそも、EOFかどうかを判定する場所はそこでいいのでしょうか。
18行目の直後(つまりファイルから1文字読んだ直後)であるような気がします。

他に気になったのは
 ・int型のfpとvoid *型(であるはず)のNULLとを比較するのは適切か?
 ・読むべきファイルがなかった場合においても、何ごともなかったように読もうとしているのは適切か?

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

Posted: 2015年3月22日(日) 21:57
by しー
amehiruneさんboxさん
コメントありがとうございます。
EOF判定について意見いただいたので考えなおしてみたところ

コード:

while (FileRead_eof(fp) == 0){
		humen[i].knd = FileRead_getc(fp);
		if (humen[i].knd != ' ' && humen[i].knd != '\n')
			if (humen[i].knd != 0){
				humen[i].flag = 1;
				humen[i].cnt = cnt;
				cnt++;
			}
		DrawFormatString(5, 5, GetColor(255, 255, 255), "knd=%d, flag=%d, cnt=%d", humen[i].knd, humen[i].flag, humen[i].cnt);
		i++;
	}
に変更したところ読み込み中ではなくなりました!ありがとうございます。

ただまだ、hume.kndの表示はできません・・

引き続きアドバイスお願いします。

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

Posted: 2015年3月22日(日) 22:11
by しー
何度もすみません((+_+))
Boxさんのコメントでファイルの読み込みエラー時にプログラムを終了、
うまく読み込めたときはキーボードの入力を受けたときにプログラムを終了するように処理を追加しました。
そうすると、実行後すぐにプログラムが終了したのでどうやらファイルがうまく読み込みできてないようです。
こちらの原因がわかるかた
またアドバイスお願いします!!

コード:


#include "../include/DXlib.h"

typedef struct{
	int flag;
	int cnt;
	int knd;
}Humen;

Humen humen[1000];

int load_humen(){
	int fp, i = 0, cnt = 0;
	fp = FileRead_open(".. / file / lism / txt");

	if (fp == NULL)
	{
		DrawString(5, 5, "error", GetColor(255, 255, 255));
		return -1;
		
	}

	while (FileRead_eof(fp) == 0){
		humen[i].knd = FileRead_getc(fp);
		if (humen[i].knd != ' ' && humen[i].knd != '\n')
			if (humen[i].knd != 0){
				humen[i].flag = 1;
				humen[i].cnt = cnt;
				cnt++;
			}
		DrawFormatString(5, 5, GetColor(255, 255, 255), "knd=%d, flag=%d, cnt=%d", humen[i].knd, humen[i].flag, humen[i].cnt);
		i++;
	}
	FileRead_close(fp);
	return 1;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

	ChangeWindowMode(TRUE);//ウィンドウモード
	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化

	if (DxLib_Init() == -1)    // DXライブラリ初期化処理
	{
		return -1;    // エラーが起きたら直ちに終了
	}

	DrawFormatString(5, 5, GetColor(255, 255, 255), "0");

	 if (load_humen() == -1) return 0;


	while (CheckHitKeyAll() == 0)
	{
		DrawFormatString(5, 5, GetColor(255, 255, 255), "0 = %d", humen[0].knd);
		DrawFormatString(5, 15, GetColor(255, 255, 255), "1 = %d", humen[1].knd);
		DrawFormatString(5, 25, GetColor(255, 255, 255), "2 = %d", humen[2].knd);
	}
	WaitKey();      // キー入力待ち
	DxLib_End();
	return 0;
}


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

Posted: 2015年3月22日(日) 22:29
by みけCAT
しー さんが書きました:実行後すぐにプログラムが終了したのでどうやらファイルがうまく読み込みできてないようです。
ファイルの読み込み処理が走っていることは確かめたのですか?
単にDxLib_Init()を2回呼んでいるから、ということは無いですか?

【追記】最初のプログラムでもそうなっていたので、多分無いですよね…。

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

Posted: 2015年3月22日(日) 22:30
by みけCAT
".. / file / lism / txt"という変なパスにファイルは本当に存在するのですか?

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

Posted: 2015年3月22日(日) 22:39
by しー
みけCATさん
コメントありがとうございます。

".. / file / lism / txt"の部分はここにコピーした時のミスでした・・
実際のプログラムは正しいパスになっています。

ファイルの読み込み処理が走っているか確認するため

コード:

	while (FileRead_eof(fp) == 0){
		DrawString(5, 5, "while OK", GetColor(255, 255, 255));
		humen[i].knd = FileRead_getc(fp);
とDrawStringの処理を追加しましたが画面に文字は出ませんでした・・

またWinMainの中のDrawFormatStringの処理の文字も出ないので
これらの使い方がおかしいのでしょうか?

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

Posted: 2015年3月22日(日) 23:51
by みけCAT
しー さんが書きました:ファイルの読み込み処理が走っているか確認するため

コード:

	while (FileRead_eof(fp) == 0){
		DrawString(5, 5, "while OK", GetColor(255, 255, 255));
		humen[i].knd = FileRead_getc(fp);
とDrawStringの処理を追加しましたが画面に文字は出ませんでした・・

またWinMainの中のDrawFormatStringの処理の文字も出ないので
これらの使い方がおかしいのでしょうか?
はい、そうです。
描画先を裏画面にしているので、ScreenFlip()を呼ばないと画面に反映されないはずです。
ErrorLogAdd()でLog.txtにログを吐いてみてはいかがでしょうか?

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

Posted: 2015年3月23日(月) 16:10
by しー
みけCATさん
ScreenFlip();で表示でき、ちゃんと配列に入っていました!
ありがとうございます!!