データのロード、セーブが出来ない (.iniのファイル)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
s707

データのロード、セーブが出来ない (.iniのファイル)

#1

投稿記事 by s707 » 14年前

オプション関数で曜日を変更するプログラムです。
曜日情報をロード、セーブしたいのですが

.iniファイルの更新日時や内容から見ても
.iniにアクセスしている様子がありません。

ご助力の程、よろしくお願いします。

コード:


//main.cpp
#include "DxLib.h"

extern struct dayData{
    char name[9];
    char number[6];
} ;

void option(struct dayData* day);
void time();
void date();
void load_day(struct dayData* day);
void save_day(struct dayData* day);
int title(int);



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	struct dayData day[7];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);


	if ( DxLib_Init( ) == -1 ) return -1;

	while (1){
		load_day(day);//日にちを読み込む
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if ( ProcessMessage() == -1 || !status && nClickR_Count == 1){  // プロセスメッセージは1ループ毎に1回必要
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
			ClearDrawScreen();
		}

		int temp = title(status);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				time();
				status = 0;
			}
			else if(status == 2 ){
				date();
				status = 0;
			}
			else if(status){
				option(day);
				save_day(day);//日にちを書き込む
			}
		}

		// 今回のクリック状態を保持する
		nClickPrev = nClickNow;
		nClickPrev_R = nClickNow_R;
	}

	DxLib_End(); 
	return 0;
}



//title.cpp
#include "DxLib.h"
#include <time.h>
#define  FontSize 40

int title(int hyouji_hantei){
	int status=0; 
	if(hyouji_hantei != 3){
		int Cr_0,Cr_1,Cr_2 ;
		int	MouseInput=0,MouseX=0,MouseY=0;

		// 描画する文字列のサイズを設定
		SetFontSize( FontSize ) ;

		// 白色の値を取得
		Cr_0 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_1 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_2 = GetColor( 0xff , 0xff , 0xff ) ;

		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );

		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;

		if(MouseX > 20 && MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
			Cr_0 = GetColor( 0xff , 0xff , 0 ) ;
			status = 1;
		}
		else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
			Cr_1 = GetColor( 0xff , 0xff , 0 ) ;
			status = 2;
		}
		else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
			Cr_2 = GetColor( 0xff , 0xff , 0 ) ;
			status = 3;
		}
		else
			status = 0;
		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );
	}

	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	if( !min[0] && !min[1] && !sec[0] && !sec[1] && !status )status = 1;//一時間毎に時刻を読む

	return status;
}



//option.cpp
#include "DxLib.h"

#define FontSize 48

struct dayData{
    char name[9];
    char number[6];
} ;

void option(struct dayData* day)
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	// マウスを表示状態にする
	SetMouseDispFlag(TRUE);

	// 文字列表示色を白で初期化しておく
	int nColor[4] = {GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF)};
	
	int nMouseX = 0;
	int nMouseY = 0;

	// 曜日情報保持用配列
	static int nDayState[4] = {0, 0, 0, 0};

	ClearDrawScreen();

	// マウスの位置を取得
	GetMousePoint(&nMouseX, &nMouseY);

	// 文字の色と曜日の更新
	for (int i = 0; i < 4; ++i)
	{
		// クリックされた箇所の判定
		if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
		{
			// 色を変更して、曜日を1つ進める
			nColor[i] = GetColor(0xFF, 0xFF, 0x00);

			// 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる
			nDayState[i] = (nDayState[i] + 1) % ((i == 3) ? 2 : 7); 
		}
		else
		{
			// 今回変更した箇所以外の色を戻す
			nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
		}
	}

	// 文字列の描画
	const char* pszDay1[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
	const char* pszDay2[] = {"当日", "翌日"};
	DrawString( 64,  64, "燃えるゴミ", nColor[0]);
	DrawString( 64, 128, "燃えないゴミ", nColor[1]);
	DrawString( 64, 192, "資源ゴミ", nColor[2]);
	DrawString( 64, 256, "再生日切替", nColor[3]);
	DrawString(448,  64, pszDay1[nDayState[0]], nColor[0]);
	DrawString(448, 128, pszDay1[nDayState[1]], nColor[1]);
	DrawString(448, 192, pszDay1[nDayState[2]], nColor[2]);
	DrawString(448, 256, pszDay2[nDayState[3]], nColor[3]);
	ScreenFlip();
	
	for (int i = 0; i < 4; i++){//燃える 燃えない 資源 再生日切り替えの4つのナンバーを更新
	    ( day + i ) -> number[0] = nDayState[i];
	}
}

//-----------------------------------------------------------------------------
// Name: load_day()
// Desc: 日にち読み込み関数
//-----------------------------------------------------------------------------
void load_day(struct dayData* day){
    char key1[7]="name_0";
    char key2[8]="day_0";

    //INIファイル読み込み
    for(int i=0;i<4;i++){//燃える 燃えない 資源 再生日切り替えの4つ
        GetPrivateProfileString("Day",key1,"--------", (day+i) -> name,9,"Day.INI");
        GetPrivateProfileString("Day",key2,"00000"   , (day+i) -> number,6,"Day.INI");
        key1[5]++;//アンダーラインの後ろの数字をインクリメント
        key2[4]++;
    }
}
//-----------------------------------------------------------------------------
// Name: save_day()
// Desc: 日にち書き込み関数
//-----------------------------------------------------------------------------
void save_day(struct dayData* day){
    char key1[7]="name_0";
    char key2[8]="day_0";

    //INIファイル書き込み
	for(int i=0;i<4;i++){//燃える 燃えない 資源 再生日切り替えの4つ
        WritePrivateProfileString("Day",key1, (day+i) -> name,"Day.INI");
        WritePrivateProfileString("Day",key2, (day+i) -> number,"Day.INI");
        key1[5]++;
        key2[4]++;
    }
}


アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: データのロード、セーブが出来ない (.iniのファイル)

#2

投稿記事 by h2so5 » 14年前

GetPrivateProfileString関数の説明をよく読みましょう。
引数として相対パスを指定した場合は実行ファイルのディレクトリではなく、
Windowsフォルダを基準として解釈されます。

このソースだと、C:¥windows¥Day.INI にアクセスしていることになりますが、
Vista以上の環境だとUACによりアクセスがブロックされます。

s707

Re: データのロード、セーブが出来ない (.iniのファイル)

#3

投稿記事 by s707 » 14年前

h2so5様ご返信ありがとうございます。

Resourseフォルダを作成した後

GetPrivateProfileString("Day",key1,"--------", (day+i) -> name,9,"Resourse./Day.INI");

と修正したらアクセスを確認しました。


ただ、データのロードとセーブは失敗していたので
これから修正していきたいと思います。

s707

Re: データのロード、セーブが出来ない (.iniのファイル)

#4

投稿記事 by s707 » 14年前

main.cpp(7): warning C4091: 'extern ' : 変数が何も宣言されていないときは、'dayData' の左辺を無視します。
このエラーが関係してるかもしれません。

調べてみると意味のない記述がされている時にでるそうですが。
7行目の少し前の

extern struct dayData{

struct dayData{

にしてみるとワーニングは無くなりました。
ただ

struct dayData{
char name[9];
char number[6];
} ;
がmain.cppとoption.cppの両方にあるのはおかしいような気がします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: データのロード、セーブが出来ない (.iniのファイル)

#5

投稿記事 by softya(ソフト屋) » 14年前

コード:

extern struct dayData{
    char name[9];
    char number[6];
} ;
は間違いですね。
struct dayDataは構造体の宣言であって、実体ではないのでexternを書くのは間違っています。

普通は、下記をヘッダファイルに書いてmain.cppとoption.cppでインクルードさせます。

コード:

struct dayData{
    char name[9];
    char number[6];
} ;
[追記]
ただ、「データのロードとセーブは失敗」とは関係ないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: データのロード、セーブが出来ない (.iniのファイル)

#6

投稿記事 by s707 » 14年前

ソフト屋さんもご返信ありがとうございます。
なんとか出来ました。

ただoption.cppのコードを
もう少しキレイにしたい所ですが。

アスキーコードを変換する以外に
何か方法はありますか?

コード:



//dayData.h
struct dayData{
    char name[9];
    char number[6];
} ;


//main.cpp
#include "DxLib.h"
#include "dayData.h"

void option(struct dayData* day);
void time();
void date();
void load_day(struct dayData* day);
void save_day(struct dayData* day);
int title(int);



int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	struct dayData day[4];
	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0;

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	SetWindowSizeExtendRate(0.5);	

	SetDrawScreen(DX_SCREEN_BACK);
	SetWindowStyleMode(2);


	if ( DxLib_Init( ) == -1 ) return -1;
	
	while (1){
		load_day(day);//日にちを読み込む
		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		nClickNow_R = (GetMouseInput() & MOUSE_INPUT_RIGHT);

		if(	nClickNow_R )nClickR_Count++;//右クリックを押しているときはカウントアップ
		else{nClickR_Count = 0;}//それ以外ではカウントを0にする

		if ( ProcessMessage() == -1 || !status && nClickR_Count == 1){  // プロセスメッセージは1ループ毎に1回必要
			break;
		}

		if ( nClickNow_R && !nClickPrev_R){
			status = 0;
			ClearDrawScreen();
		}

		int temp = title(status);

		if( nClickNow && !nClickPrev){
			if(temp)
				status = temp;

			if(status == 1){
				time();
				status = 0;
			}
			else if(status == 2 ){
				date();
				status = 0;
			}
			else if(status){
				option(day);
				save_day(day);//日にちを書き込む
			}
		}

		// 今回のクリック状態を保持する
		nClickPrev = nClickNow;
		nClickPrev_R = nClickNow_R;
	}

	DxLib_End(); 
	return 0;
}


//title.cpp
#include "DxLib.h"
#include <time.h>
#define  FontSize 40

int title(int hyouji_hantei){
	int status=0; 
	if(hyouji_hantei != 3){
		int Cr_0,Cr_1,Cr_2 ;
		int	MouseInput=0,MouseX=0,MouseY=0;

		// 描画する文字列のサイズを設定
		SetFontSize( FontSize ) ;

		// 白色の値を取得
		Cr_0 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_1 = GetColor( 0xff , 0xff , 0xff ) ;
		Cr_2 = GetColor( 0xff , 0xff , 0xff ) ;

		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );

		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;

		if(MouseX > 20 && MouseX < 176 && MouseY > 384 && MouseY < 384 + FontSize){//時刻の色変更
			Cr_0 = GetColor( 0xff , 0xff , 0 ) ;
			status = 1;
		}
		else if(MouseX >= 176 && MouseX < 416 && MouseY > 384  && MouseY < 384 + FontSize){//日付・曜日の色変更
			Cr_1 = GetColor( 0xff , 0xff , 0 ) ;
			status = 2;
		}
		else if(MouseX >= 416 && MouseY > 384  && MouseY < 384 + FontSize){//オプションの色変更
			Cr_2 = GetColor( 0xff , 0xff , 0 ) ;
			status = 3;
		}
		else
			status = 0;
		// 文字列の描画
		DrawString( 16 , 384 , "時刻" , Cr_0 );
		DrawString( 176 , 384 , "日付/曜日" , Cr_1 );
		DrawString( 416 , 384 , "オプション" , Cr_2 );
	}

	time_t timer;
	struct tm *local;
	timer = time(NULL);//現在時刻を取得
	local = localtime(&timer); //地方時に変換

	int min[2],sec[2];
	min[0] = (local->tm_min / 10)%10;
	min[1] = local->tm_min % 10;

	sec[0] = (local->tm_sec / 10)%10;
	sec[1] = local->tm_sec % 10;

	if( !min[0] && !min[1] && !sec[0] && !sec[1] && !status )status = 1;//一時間毎に時刻を読む

	return status;
}


//option.cpp
#include "DxLib.h"
#include "dayData.h"

#define FontSize 48

void option(struct dayData* day)
{
	// 描画する文字列のサイズを設定
	SetFontSize(FontSize);

	// マウスを表示状態にする
	SetMouseDispFlag(TRUE);

	// 文字列表示色を白で初期化しておく
	int nColor[4] = {GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF), GetColor(0xFF, 0xFF, 0xFF)};

	int nMouseX = 0;
	int nMouseY = 0;

	ClearDrawScreen();

	// マウスの位置を取得
	GetMousePoint(&nMouseX, &nMouseY);
	static int arr[4] = {( day + 0 ) -> number[0],( day + 1 ) -> number[0],( day + 2 ) -> number[0],( day + 3 ) -> number[0]};//配列の添え字になる変数

	// 文字の色と曜日の更新
	for (int i = 0; i < 4; ++i)
	{
		switch( ( day + i ) -> number[0] ){//アスキーコードを配列の要素数に変換
		case 48:
			( day + i ) -> number[0] = 0;
			break;
		case 49:
			( day + i ) -> number[0] = 1;
			break;
		case 50:
			( day + i ) -> number[0] = 2;
			break;
		case 51:
			( day + i ) -> number[0] = 3;
			break;
		case 52:
			( day + i ) -> number[0] = 4;
			break;
		case 53:
			( day + i ) -> number[0] = 5;
			break;
		case 54:
			( day + i ) -> number[0] = 6;
			break;
		}
		// クリックされた箇所の判定
		if (nMouseY > (64 * i) + FontSize && nMouseY < (64 * (i + 1) + FontSize))
		{
			// 色を変更して、曜日を1つ進める
			nColor[i] = GetColor(0xFF, 0xFF, 0x00);
			// 再生日切替の場合は0~1でループさせ、それ以外は0~6でループさせる 1回押されたら1%7又は1%2で月曜 翌日
			( day + i ) -> number[0] = ( ( day + i ) -> number[0] + 1 ) % ((i == 3) ? 2 : 7);
		}
		else
		{
			// 今回変更した箇所以外の色を戻す
			nColor[i] = GetColor(0xFF, 0xFF, 0xFF);
		}

		arr[i] = ( day + i ) -> number[0];		

	}

	// 文字列の描画
	const char* pszDay1[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"};
	const char* pszDay2[] = {"当日", "翌日"};
	DrawString( 64,  64, "燃えるゴミ", nColor[0]);
	DrawString( 64, 128, "燃えないゴミ", nColor[1]);
	DrawString( 64, 192, "資源ゴミ", nColor[2]);
	DrawString( 64, 256, "再生日切替", nColor[3]);
	DrawString(448,  64, pszDay1[ arr[0] ], nColor[0]);
	DrawString(448, 128, pszDay1[ arr[1] ], nColor[1]);
	DrawString(448, 192, pszDay1[ arr[2] ], nColor[2]);
	DrawString(448, 256, pszDay2[ arr[3] ], nColor[3]);
	ScreenFlip();

	//画面に表示したので配列の要素数をアスキーコードに戻す
	for (int i = 0; i < 4; ++i){
		switch( ( day + i ) -> number[0] ){
		case 0:
			( day + i ) -> number[0] = 48;
			break;
		case 1:
			( day + i ) -> number[0] = 49;
			break;
		case 2:
			( day + i ) -> number[0] = 50;
			break;
		case 3:
			( day + i ) -> number[0] = 51;
			break;
		case 4:
			( day + i ) -> number[0] = 52;
			break;
		case 5:
			( day + i ) -> number[0] = 53;
			break;
		case 6:
			( day + i ) -> number[0] = 54;
			break;
		}
	}

}

//-----------------------------------------------------------------------------
// Name: load_day()
// Desc: 日にち読み込み関数
//-----------------------------------------------------------------------------
void load_day(struct dayData* day){
	char key1[7]="name_0";
	char key2[6]="day_0";

	//INIファイル読み込み
	for(int i=0;i<4;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		GetPrivateProfileString("Day",key1,"--------", (day+i) -> name,9,"Resourse./Day.INI");
		GetPrivateProfileString("Day",key2,"00000"   , (day+i) -> number,6,"Resourse./Day.INI");
		key1[5]++;//アンダーラインの後ろの数字をインクリメント
		key2[4]++;
	}
}
//-----------------------------------------------------------------------------
// Name: save_day()
// Desc: 日にち書き込み関数
//-----------------------------------------------------------------------------
void save_day(struct dayData* day){
	char key1[7]="name_0";
	char key2[6]="day_0";

	//INIファイル書き込み
	for(int i=0;i<4;i++){//燃える 燃えない 資源 再生日切り替えの4つ
		WritePrivateProfileString("Day",key1, (day+i) -> name,"Resourse./Day.INI");
		WritePrivateProfileString("Day",key2, (day+i) -> number,"Resourse./Day.INI");
		key1[5]++;
		key2[4]++;
	}
}




アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: データのロード、セーブが出来ない (.iniのファイル)

#7

投稿記事 by softya(ソフト屋) » 14年前

( day + i ) -> number[0] -= '0';

( day + i ) -> number[0] += '0';
でswitchは不要になると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

s707

Re: データのロード、セーブが出来ない (.iniのファイル)

#8

投稿記事 by s707 » 14年前

ありがとうございます。
スッキリと
解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る