お世話になっております、山崎です。
以前、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に分けて
取り出せるのでしょうか。
皆様のお知恵におすがりしたいと思います。
FileRead_scanfで
Re:FileRead_scanfで
たしか、scanf 系の関数は、基本文字列の読み込みを空白で区切るため、この問題が出ていると思います。
(空白文字は半角スペースのほかに、タブ文字、改行文字も含まれています)
簡単に解決するならば、":"の代わりに半角スペースかタブ文字を入れてはどうでしょうか。
(空白文字は半角スペースのほかに、タブ文字、改行文字も含まれています)
簡単に解決するならば、":"の代わりに半角スペースかタブ文字を入れてはどうでしょうか。
Re:FileRead_scanfで
FileRead_scanf(ItemFileHandle, "%[^:]:%s", ItemData1, ItemData2);
できると思います
できると思います
Re:FileRead_scanfで
御津凪様 GPGA様
ご返信、誠にありがとうございます。
GPGA様のおっしゃる方法を試してみたところ、見事に期待通りの
結果を得ることができました。
まだ私の実力ではなぜこの方法でうまくいくのかは
よくわかりませんが、精進していこうと思います。
このたびは誠にありがとうございました。
ご返信、誠にありがとうございます。
GPGA様のおっしゃる方法を試してみたところ、見事に期待通りの
結果を得ることができました。
まだ私の実力ではなぜこの方法でうまくいくのかは
よくわかりませんが、精進していこうと思います。
このたびは誠にありがとうございました。
Re:FileRead_scanfで
scanfにおいて
%[0-9]とした場合、数字である限り、読み続けるという意味になります。
%[^0-9]とした場合、数字でない限り、読み続けるという意味になります。
以下のプログラムを実行して、挙動を確認してみてください
上記に従いまして、%[^:]は、:でない限り、読み続けるという意味になります。
%[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で
GPGA様
わざわざサンプルコードを示してくださり、誠にありがとうございます。
scanfは正規表現のようなことができるのですね・・・これは全く知りませんでした。
プログラマとしてまたひとつ賢くなりました。
お手数をおかけして申し訳ございません、本当にありがとうございました。
わざわざサンプルコードを示してくださり、誠にありがとうございます。
scanfは正規表現のようなことができるのですね・・・これは全く知りませんでした。
プログラマとしてまたひとつ賢くなりました。
お手数をおかけして申し訳ございません、本当にありがとうございました。