こんにちわ
file.txtの内容
-------------
"a b" "ccccccccc"
"c" "dd"
"dd" "ee"
-------------
などスペースの数が不特定で
文字を入力しfile.txtを読み込んで入力した文字と左側の文字が一致した場合
一致した文字の右側の文字を画面に表示させたいのですが
fscanfだと1行目の"a b"内のスペースで変になってしまいます
回答をよろしくお願いします
fscanfではなく、fgetsで1行単にに取得したほうが、
その後の文字列の加工等、融通が利きます。
一発で取得できるような便利な方法はありませんので、
Blue氏の指摘どおりfgetsで取得して、あとは自分で解析しながら取り込むことになります。
正規表現のライブラリが使えるかもしれません。
fgetsで1行読み込んで
1文字ずつ処理で"の1つ目から2つ目まで、3つ目から4つ目までの文字を取り出す感じですね。
分かりました、ありがとうございます。
正規表現..調べてみます
ありがとうございました
> 正規表現..調べてみます
正規表現のライブラリは
C言語の標準の機能ではないので、注意してください。
VCでCOM等を使えばできるかもしれません。
(使うのは簡単だが、用意するまでがめんどくさいかと)
# boostは別途ダウンロードしなきゃいけないので
"〜" の中身を取得する程度なら、そのようなライブラリを利用せずとも
簡単に実装できると思います。
(文字列を先頭から1文字ずつみて開始位置と終了位置を調べて切り出すだけ)
言語標準ではありませんが、
一応VC7にはCAtlRegExpというクラスが予め用意されます。(VC6にはないはず)
#可搬性を考えると微妙かもしれませんが、
#準備や用法はまぁ普通かと。
> "〜" の中身を取得する程度なら、そのようなライブラリを利用せずとも
> 簡単に実装できると思います。
御意
正規表現はboostのRegex Libraryを使うといいと分かったのですがこれ以上良く分からないので http://www.boost.org/
fgetsで作りました
FILE *fn;
if ((fn=fopen(fname,"rt"))!=NULL)
{
int wc,cmds,mess;
char s[225];
char cmd[225];
char mes[225];
while (!feof(fn))
{
fgets(s,220,fn);
wc = 0;
cmds = 0;
mess = 0;
for (int i=0;i<strlen(s);i++){
if(s[i]=='\"')wc++;
else
{
switch(wc)
{
case 1:
{
sprintf(cmd+cmds,"%c",s[i]);
cmds++;
break;
}
case 3:
{
sprintf(mes+mess,"%c",s[i]);
mess++;
break;
}
}
}
}
if (入力文字とcmd比較)
{
mesを表示;
fclose(fn);
return;
}
}
fclose(fn);
}
Blueさん、毘沙門天さん、Banさん
ありがとうございました。
ツイート | ![]() |