ページ 1 / 1
iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月08日(水) 14:52
by ノダッシー
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;//ループを抜ける
}
宜しくお願いします
Re: iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月08日(水) 22:11
by みけCAT
コード(特にループの内部)があまりにも適当だったので、申し訳ありませんが普通に実装させていただきました。
エラーチェックはしていません。必要に応じて実装してください。
コード:
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);
Re: iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月10日(金) 15:23
by ノダッシー
レスありがとうございます
みけ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ファイルからデータを読み込み変数に代入したい
Posted: 2014年10月10日(金) 17:21
by かずま
ノダッシー さんが書きました: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;
}
Re: iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月10日(金) 23:17
by みけCAT
ノダッシー さんが書きました:具体的には変数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());
としてください。
Re: iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月15日(水) 14:48
by ノダッシー
>>かずまさん
レスありがとうございます
折角コードを考えて頂いたのですが、実装すると後からデータを追加した時にうまく読み込めない不具合が出てしまい自分自身理解できていないのでこちらのコードを使うことにしました
コード:
// ファイルを入力用でオープン
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]
Re: iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月15日(水) 15:01
by みけCAT
・messagesの初期値内のValue(数字)をValue(数字).c_str()としてみてください。
・Value(数字)を配列にするか、もっと分かりやすい名前にすることを強く推奨します。
この変更を行う場合は、messagesの初期値の表現もそれに合わせてください。
Re: iniファイルからデータを読み込み変数に代入したい
Posted: 2014年10月16日(木) 15:10
by ノダッシー
.c_str()を付ける事で解決しました。
ひとまずこちらのトピックは終了します
お答え頂きありがとうございました