いつもお世話になっております。
先日皆様からのアドバイスで、ファイルから文字を読み取ってこれたのですが、
条件に合った文字列が入ってきた時の処理に困っています。
以下のようなコードを書きました。
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
]
フ
フ
フ
フ
・
・
・
と入ってきています。この半角文字の「フ」とは一体何なのでしょう?
どうかアドバイスをいただけませんでしょうか?
安直な解決策を書けば
if(memcmp(cLine, [INF], strlen(cLine))==0)
を
if(memcmp(cLine, [INF], strlen([INF]))==0)
に、変えればよいんでは。
あと”フ”ですけど、クリアされてない変数領域には”フ”が入るようです。
Debug の場合。
Releaseの場合は何が入っているかわかりません。
ところで fgets って取得情報の最後に'\0'って入らないんでしたっけ。
最近使ってないんで忘れてしまいました。
ん様、ありがとうございます。
うまくいきました!
やはり「フ」が入るのは領域が初期化されていなかったからですね...。
疑問がとけてすっきりしました。
>ところで fgets って取得情報の最後に'\0'って入らないんでしたっけ。
調べてみたところ、\0は入るようです。
既に解決しているようですが、追加コメントです。
コスモスさんの最初の方法で上手くいかなかったのは、改行文字も読み込まれると付加されてし
まっているからです。
んさんの方法では、行頭が[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度目以降の質問であっても、開発環境などの情報は記述するようにしましょう
sara様、アドバイスありがとうございました!
さらにプログラムの性能が上がり感謝しています。
色々と条件を考えて作っていかなければいけませんね。
大変勉強になりました。
また、バージョンの書き忘れ、大変失礼致しました。
今回はWindows2000、VisuaC++6.0で作成しております。