文字列の取得について

[戻る]
コスモス 2002/06/05(水) 14:54:20
いつもお世話になっております。

  先日皆様からのアドバイスで、ファイルから文字を読み取ってこれたのですが、
  条件に合った文字列が入ってきた時の処理に困っています。

  以下のようなコードを書きました。

  char cLine[128];
  //c_systpndataファイル読み込み
 while (fgets(cLine, 100, fpc) != NULL)
  {
    //文字列が[INF]であればカウントUP
    if(memcmp(cLine, "[INF]", strlen(cLine))==0){
    iCount++;
  }

  これでデバッグしていったのですが、cLineに「[INF]」と入っていても、
  このif文の中に入ってきてくれません。
    
  ウォッチで見てみるとcLine配列の中に
  
  [
  I
  N
  F
  ]

  フ
  フ
  フ
  フ
  ・
  ・
  ・
  と入ってきています。この半角文字の「フ」とは一体何なのでしょう?
  どうかアドバイスをいただけませんでしょうか?

[E-Mail] 2002/06/05(水) 15:16:15
安直な解決策を書けば

 if(memcmp(cLine, "[INF]", strlen(cLine))==0)
 を
 if(memcmp(cLine, "[INF]", strlen("[INF]"))==0)
 に、変えればよいんでは。

あと”フ”ですけど、クリアされてない変数領域には”フ”が入るようです。
Debug の場合。
Releaseの場合は何が入っているかわかりません。

ところで fgets って取得情報の最後に'\0'って入らないんでしたっけ。
最近使ってないんで忘れてしまいました。

コスモス 2002/06/05(水) 15:31:21
[[解決]]
ん様、ありがとうございます。
うまくいきました!

やはり「フ」が入るのは領域が初期化されていなかったからですね...。
疑問がとけてすっきりしました。

>ところで fgets って取得情報の最後に'\0'って入らないんでしたっけ。
調べてみたところ、"\0"は入るようです。

sara 2002/06/05(水) 16:15:37
既に解決しているようですが、追加コメントです。

コスモスさんの最初の方法で上手くいかなかったのは、改行文字も読み込まれると付加されてし
まっているからです。
んさんの方法では、行頭が"[INF]"であるかどうかは判断できますが、"[INF][]"などが読み込
まれてもカウントされることになることに注意しましょう。

比較する前に、行末の改行文字をカットするようにすると、混乱がなくなります。
行末の改行文字をカットする関数を作っておくと便利です。

例)
void CutNLCode( char* strline )
{
   int len = strlen(strline);
   if( len == 0 )    return;

   if( strline[len-1] == '\n' )
      strline[len-1] = '\0';
}

-----------------------------------------------------------
  char cLine[128];
  //c_systpndataファイル読み込み
 while (fgets(cLine, 100, fpc) != NULL)
  {
    CutNLCode(cLine);    // 改行コードをカット
    //文字列が[INF]であればカウントUP
    if(strcmp(cLine, "[INF]")==0){
    iCount++;
  }
-----------------------------------------------------------
とすると上手くいくと思います。

#2度目以降の質問であっても、開発環境などの情報は記述するようにしましょう

コスモス 2002/06/05(水) 17:15:55
sara様、アドバイスありがとうございました!
さらにプログラムの性能が上がり感謝しています。
色々と条件を考えて作っていかなければいけませんね。
大変勉強になりました。

また、バージョンの書き忘れ、大変失礼致しました。
今回はWindows2000、VisuaC++6.0で作成しております。

古いスレッドには追加発言できません。