iniファイルからデータを読み込み変数に代入したい

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

iniファイルからデータを読み込み変数に代入したい

#1

投稿記事 by ノダッシー » 10年前

settei.iniというテキストファイルの中に
12,40,13,40,C:\Users\noda\Desktop\引っ越し\test.wav
それぞれ音を鳴らす時間と鳴らす音を指定したフルパスを書いていますが
それを取り出す方法がわかりません
以下は自分で書いてみたソースです。。

どこを直せばよいかご指摘願います
最終的には前回作成したタイマーに組み込む予定です→前回のタイマー
それと指定したパスを表示させようとすると文字が化けてしまう不具合が生じています

コード:

	
int FileHandle;
	char String[256];
	char n[256];
	int ji; //時
	int ji2; //時

	int funn; //分
	int funn2; //分2
	int count = 0; //,の数をカウント

	// test.cpp ファイルを開く
	FileHandle = FileRead_open("settei.ini");
	// 一行読む
	FileRead_gets(String, 256, FileHandle);
	
	//,で区切られた値を変数に代入する
	for (int i = 0; i < 256; i++){
		n[i] = String[i];//一文字ずつtimerに入れていき
			if (n[i] == ','){//,があった場合
				ji = n[i - 2];//jiに,の2文字前を入れる 13なので1が入るはず
				ji2 = n[i - 1];//jiに,の1文字前を入れる 13なので3が入るはず
				count++;//,一つ見つける度に+1
				if (count == 1){//,一つ目
					funn = n[i - 2];//funnに,の2文字前を入れる40なので4が入るはず
					funn = n[i - 1];//funnに,の1文字前を入れる40なので0が入るはず
				}
				//パスを取得するコード
                               //???

				if (n[i] == '\0'){ //終端に達したら
					break;//ループを抜ける
			}
宜しくお願いします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: iniファイルからデータを読み込み変数に代入したい

#2

投稿記事 by みけCAT » 10年前

コード(特にループの内部)があまりにも適当だったので、申し訳ありませんが普通に実装させていただきました。
エラーチェックはしていません。必要に応じて実装してください。

コード:

int FileHandle;
	char String[256];
	char n[256];
	int ji; //時
	int ji2; //時

	int funn; //分
	int funn2; //分2
	int count; //nのバイト数をカウント
	enum STATUS {
		STAT_BEGIN,
		STAT_JI,
		STAT_FUNN,
		STAT_JI2,
		STAT_FUNN2,
		STAT_PATH,
		STAT_INVALID
	} stat = STAT_BEGIN;

	// test.cpp ファイルを開く
	FileHandle = FileRead_open("settei.ini");
	// 一行読む
	FileRead_gets(String, 256, FileHandle);
	
	//,で区切られた値を変数に代入する
	for (int i = 0; i < 256; i++){
		if (String[i] == '\0') {
			n[count] = '\0';
			break;
		}
		switch(stat) {
			case STAT_BEGIN:
				if (String[i] == ',') {
					ji = 0;
					stat = STAT_FUNN;
				} else {
					ji = String[i] - '0';
					stat = STAT_JI;
				}
				break;
			case STAT_JI:
				if (String[i] == ',') {
					funn = 0;
					stat = STAT_FUNN;
				} else {
					ji = ji * 10 + (String[i] - '0');
				}
				break;
			case STAT_FUNN:
				if (String[i] == ',') {
					ji2 = 0;
					stat = STAT_JI2;
				} else {
					funn = funn * 10 + (String[i] - '0');
				}
				break;
			case STAT_JI2:
				if (String[i] == ',') {
					funn2 = 0;
					stat = STAT_FUNN2;
				} else {
					ji2 = ji2 * 10 + (String[i] - '0');
				}
				break;
			case STAT_FUNN2:
				if (String[i] == ',') {
					count = 0;
					stat = STAT_PATH;
				} else {
					funn2 = funn2 * 10 + (String[i] - '0');
				}
				break;
			case STAT_PATH:
				n[count++] = String[i];
				break;
		}
	}
	FileRead_close(FileHandle);
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: iniファイルからデータを読み込み変数に代入したい

#3

投稿記事 by ノダッシー » 10年前

レスありがとうございます
みけCATさんに書いて頂いたコードを実装すると私の環境だとフリーズしてしまいます
申し訳ないのですが、新しく見つけてきたコードを試しました
が…今度は文字を表示できません
具体的には変数Value3(char型?)をprintf("%s\n", Value3);で表示させようとすると
 あいうえおではなく、「ト・」 と表示されてしまいます

Data.txtの中身は

5 6 あいうえおです

私の持っている本、新C言語入門の本には文字列を表示させるには%sだと書いてあるのですが…
調べてみても分からなかったので、よろしくお願いします

コード:

#include <stdio.h>
#include <fstream>
#include <string>
#include <iostream>

int main(){
	// ファイルを入力用でオープン
	std::ifstream   File("Data.txt");         // デフォルトはテキストモード

	int		Value1;     // int型
	int		Value2;     // double型
	std::string Value3;     // 文字列クラス

	File >> Value1 >> Value2 >> Value3;           // ファイルからデータを読み込む

	//std::cout << Value1 << " " << Value2 << " " << Value3;        // 読み込んだデータを表示する
	printf("%d\n", Value1);
	printf("%d\n", Value2);
	printf("%s\n", Value3);
	while (1){}

	return 0;
}

かずま

Re: iniファイルからデータを読み込み変数に代入したい

#4

投稿記事 by かずま » 10年前

ノダッシー さんが書きました:settei.iniというテキストファイルの中に
12,40,13,40,C:\Users\noda\Desktop\引っ越し\test.wav
それぞれ音を鳴らす時間と鳴らす音を指定したフルパスを書いていますが
それを取り出す方法がわかりません

コード:

#include <stdio.h>
 
int main(void)
{
    char buf[256], name[256];
    int hour, min, hour2, min2;
    FILE *fp;

    fp = fopen("settei.ini", "r");
    if (!fp) return 1;
    if (!fgets(buf, sizeof buf, fp)) return 1;
    if (sscanf(buf, "%d,%d,%d,%d,%s", &hour, &min, &hour2, &min2, name) != 5)
        return 1;
    printf("%02d:%02d %02d:%02d [%s]\n", hour, min, hour2, min2, name);
    fclose(fp);

    fp = fopen("Data.txt", "r");
    if (!fp) return 1;
    if (!fgets(buf, sizeof buf, fp)) return 1;
    if (sscanf(buf, "%d%d%s", &hour, &min, name) != 3) return 1;
    printf("%d %d [%s]\n", hour, min, name);
    fclose(fp);

    return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: iniファイルからデータを読み込み変数に代入したい

#5

投稿記事 by みけCAT » 10年前

ノダッシー さんが書きました:具体的には変数Value3(char型?)をprintf("%s\n", Value3);で表示させようとすると
 あいうえおではなく、「ト・」 と表示されてしまいます
Value3はchar型ではなくstd::string型(std::basic_string<char>型?)です。コードにはっきり書いてありますね。
ノダッシー さんが書きました:私の持っている本、新C言語入門の本には文字列を表示させるには%sだと書いてあるのですが…
調べてみても分からなかったので、よろしくお願いします
それは「C言語入門」の本なので、C言語にないC++の機能には対応していないようですね。
printfでstd::string型の文字列データを出力するには、

コード:

printf("%s\n", Value3.c_str());
としてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: iniファイルからデータを読み込み変数に代入したい

#6

投稿記事 by ノダッシー » 10年前

>>かずまさん
レスありがとうございます
折角コードを考えて頂いたのですが、実装すると後からデータを追加した時にうまく読み込めない不具合が出てしまい自分自身理解できていないのでこちらのコードを使うことにしました

コード:

		// ファイルを入力用でオープン
		std::ifstream   File("settei.txt");         // デフォルトはテキストモード

		int     Value1;     // int型
		int     Value2;     // int型
		int     Value3;     // int型
		int     Value4;     // int型
		int     Value5;     // int型
		int     Value6;     // int型
		int     Value7;     // int型
		int     Value8;     // int型
		int     Value9;     // int型
		int     Value10;     // int型
		int     Value11;     // int型
		int     Value12;     // int型
		int     Value13;     // int型
		int     Value14;     // int型
		int     Value15;     // int型
		int     Value16;     // int型
		int     Value17;     // int型
		int     Value18;     // int型
		int     Value19;     // int型
		int     Value20;     // int型
		std::string Value21; // 文字列クラス鳴らす音
		std::string Value22; // 文字列クラス壁紙のパス
		std::string Value23; // 文字列クラスメッセージ1おはようございます
		std::string Value24; // 文字列クラスメッセージ2おはようございます
		std::string Value25; // 文字列クラスメッセージ3今日も一日頑張りましょう
		std::string Value26; // 文字列クラスメッセージ4もうすぐお昼休みだ!
		std::string Value27; // 文字列クラスメッセージ5休憩時間です
		std::string Value28; // 文字列クラスメッセージ6午後も頑張りましょう
		std::string Value29; // 文字列クラスメッセージ7こんにちは
		std::string Value30; // 文字列クラスメッセージ8こんにちは
		std::string Value31; // 文字列クラスメッセージ9残り一時間です
		std::string Value32; // 文字列クラスメッセージ10お疲れ様でした

		File >> Value1 >> Value2 >> Value3 >> Value4 >> Value5 >> Value6 >> Value7 >> Value8 >> Value9 >> Value10 >> Value11 >> Value12 >> Value13 >> Value14 >> Value15 >> Value16 >> Value17 >> Value18 >> Value19 >> Value20 >> Value21 >> Value22 >> Value23 >> Value24 >> Value25 >> Value26 >> Value27 >> Value28 >> Value29 >> Value30 >> Value31 >> Value32;           // ファイルからデータを読み込む
>>みけCATさん
いつもお忙しいところレスありがとうございます
みけCATさんの方法でテキストのデータを変数として取り出す事ができたのですが
下記のような書き方だとエラーの赤い波線が出てきてしまいます。。。どのようにしたらいいでしょうか
よろしくお願いします

コード:

		//時間に合わせてメッセージが変わる
		/*const char* messages[18] = {
			"",
			" ",
			" ",
			" ",
			" ",
			" ", // 5
			" ",
			" ",
			"おはようござます",
			"おはようございます",
			"今日も一日頑張りましょう!", // 10
			"もうすぐお昼休みだ!",
			"休憩時間です!",
			"午後も頑張りましょう",
			"こんにちは",
			"残り1時間です", // 15
			"お疲れ様でした",
			"お疲れ様でした"
		};*/

		//時間に合わせてメッセージが変わる
		const char* messages[18] = {
			"",
			" ",
			" ",
			" ",
			" ",
			" ", // 5
			" ",
			" ",
			Value23,
			Value24,
			Value25, // 10
			Value26,
			Value27,
			Value28,
			Value29,
			Value30, // 15
			Value31,
			Value32
		};
[\code]

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: iniファイルからデータを読み込み変数に代入したい

#7

投稿記事 by みけCAT » 10年前

・messagesの初期値内のValue(数字)をValue(数字).c_str()としてみてください。
・Value(数字)を配列にするか、もっと分かりやすい名前にすることを強く推奨します。
 この変更を行う場合は、messagesの初期値の表現もそれに合わせてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ノダッシー

Re: iniファイルからデータを読み込み変数に代入したい

#8

投稿記事 by ノダッシー » 10年前

.c_str()を付ける事で解決しました。
ひとまずこちらのトピックは終了します
お答え頂きありがとうございました

閉鎖

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