FileRead_scanfで

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

FileRead_scanfで

#1

投稿記事 by 山崎 » 16年前

お世話になっております、山崎です。
以前、FileRead_scanfについてお伺いしましたが、申し訳ないながらもう一度
FileRead_scanfについてお尋ねしたいと思います。

現在、次のようなファイル(ポーション.itm)を、
":"の前後で二つの文字列型変数に分け読み出そうとしております。

ItemIndex:2
ItemName:ポーション
ItemExplanation:HPを80回復します。

そこで、以下のようなコードを書きました。
テストのため、まだループはさせないであります。

...
char ItemData1[20];
char ItemData2[200];
int ItemFileHandle=FileRead_open("ポーション.itm");
//do{
FileRead_scanf(ItemFileHandle,"%s:%s",ItemData1,ItemData2);
...
//}while(0==FileRead_eof(ItemFileHandle));
FileRead_close(ItemFileHandle);
...

このコードを実行したところ、
ItemData1には"ItemIndex:2",
ItemData2には"ItemName:ポーション"という文字列が代入されてしまい、
期待通りの結果が得られませんでした。
期待では、":"の前後で一行読み込んだ文字列を分け、
":"以前をItemData1,":"以降をItemData2に格納したいと思っています。
例のファイルの一行目を読んだとすると、
ItemData1には"ItemIndex"、ItemData2には"2"を代入させたい、といった感じです。

":"ではなく" "(スペース)でファイルの文字列を区切ったところ
とりあえずは期待通りの文字列がItemData1とItemData2に格納されたのですが、
やはり":"だと動かない理由が気になります。

どのようにすれば、ファイルの":"の前後の文字列をItemData1とItemData2に分けて
取り出せるのでしょうか。
皆様のお知恵におすがりしたいと思います。

御津凪

Re:FileRead_scanfで

#2

投稿記事 by 御津凪 » 16年前

たしか、scanf 系の関数は、基本文字列の読み込みを空白で区切るため、この問題が出ていると思います。

(空白文字は半角スペースのほかに、タブ文字、改行文字も含まれています)

簡単に解決するならば、":"の代わりに半角スペースかタブ文字を入れてはどうでしょうか。

GPGA

Re:FileRead_scanfで

#3

投稿記事 by GPGA » 16年前

FileRead_scanf(ItemFileHandle, "%[^:]:%s", ItemData1, ItemData2);
できると思います

山崎

Re:FileRead_scanfで

#4

投稿記事 by 山崎 » 16年前

御津凪様 GPGA様
ご返信、誠にありがとうございます。

GPGA様のおっしゃる方法を試してみたところ、見事に期待通りの
結果を得ることができました。

まだ私の実力ではなぜこの方法でうまくいくのかは
よくわかりませんが、精進していこうと思います。

このたびは誠にありがとうございました。

GPGA

Re:FileRead_scanfで

#5

投稿記事 by GPGA » 16年前

scanfにおいて
%[0-9]とした場合、数字である限り、読み続けるという意味になります。
%[^0-9]とした場合、数字でない限り、読み続けるという意味になります。

以下のプログラムを実行して、挙動を確認してみてください
int main() {
	char s1[80], s2[80];
	char* str = "abc123def";
	sscanf(str, "%[a-z]%[0-9]", s1, s2);
	printf("%s\n", s1);
	printf("%s\n", s2);

	sscanf(str, "%[^0-9]%[^a-z]", s1, s2);
	printf("%s\n", s1);
	printf("%s\n", s2);

	return 0;
}
 

上記に従いまして、%[^:]は、:でない限り、読み続けるという意味になります。

山崎

Re:FileRead_scanfで

#6

投稿記事 by 山崎 » 16年前

GPGA様
わざわざサンプルコードを示してくださり、誠にありがとうございます。
scanfは正規表現のようなことができるのですね・・・これは全く知りませんでした。
プログラマとしてまたひとつ賢くなりました。
お手数をおかけして申し訳ございません、本当にありがとうございました。

閉鎖

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