開発環境“windowsXP professional SP2”visualC++6.0
ログインの遷移で困ってます。
ソースファイルにテキストファイル“password.txt”から
パスワードを持ってきて遷移させるのですがどうしても
elseで返され“messagebox”が表示されてしまいます。
何分初心者なものでよくわかりません。
どなたかご教授お願いします。
以下コードを記述します。
↓
void CTheENDDlg::OnLogin()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してくださ
FILE *fp;
char string[10];
fp = fopen(password.txt ,r);
fgets(string,10,fp);
fclose(fp);
if(string == m_message ) //パスワードが一致したら
{
ShowWindow(SW_HIDE);//画面非表示
Cend myDL; //次の画面呼び出し
myDL.DoModal();
EndDialog(SW_HIDE); //画面閉じる
}
else{
MessageBox ( パスワードが間違ってます);
}
}
**テキストファイル名は“password.txt”です。
> if(string == m_message ) //パスワードが一致したら
char型ポインタが指す文字列の比較は、==演算子ではできません。
この条件式は、左右辺の文字列を指すポインタの値が等しいときに真を返します。
文字列の比較については、strcmp関数を調べてください。
補足:
C++言語ならstringクラスが、また、MFC環境ならCStringクラスがあります。
それらのクラスオブジェクトとしての文字列なら、==演算子で比較できます。
iijima様ご回答ありがとうございます。
開発環境はMFCです。
strcmp関数を調べてみます。
こういうときは、if文の前で両者を表示してみましょう。
m_messageがCStringであれば、==で比較できます。
それよりもstringの末尾に改行文字が付いているのかも・・
もしかしたら終端文字の領域がないのかもしれませんね。
>fgets(string,10,fp);
で10文字ちょうどの文字がとれるわけではないので。
例)
ファイルの内容
1234567890
の場合
stringには 123456789 という文字列が格納される。
でもやっぱりMFCつかっているならばCStdioFileとかを使ったほうがいいような。
# CStdioFileとかはマイナーなのかな。。。
あれっ、私はできましたけど・・・
何でかな!?
でも、初心者なので理由が分かりませ~ん(泣)
iijimaさんREEさん貴重なご意見ありがとうございました。
お二人のご教授により解決いたしました。
“初心者たち”さんあんまり責めないでください。
おかげさまで解決しました。
あっ!!Blueさんありがとうございました。
どう解決したのか具体的な報告を期待します。
>“初心者たち”さんあんまり責めないでください。
別に責めているわけではないでしょう。
password.txtのパスワードの後に改行があるかないかで動作が変わったりしますので・・
REEさんもうしわけありません。
プログラムを何度書き直しても“ログイン”できない
ので“txtファイル”を作り直し、
ソースファイルも書き直しました。
REEさんがおっしゃるようにFileの後に
改行がったようです。
以下にソースファイル(修正版)を載せておきます
↓
void CTheENDDlg::OnLogin()
{
// TODO: この位置にその他の検証用のコードを追加してください
FILE *fp;//パスワードをテキストファイルから参照する。
char string[10];//配列を10確保
fp = fopen(password.txt ,r);//Fileを開く(読み込みのみ)
fgets(string,10,fp);//最初の10文字比較
fclose(fp);//Fileを閉じる
UpdateData(TRUE);//変数をダイアログに更新
if(string == m_message) //パスワードを認識する
{
ShowWindow(SW_HIDE); //ログイン画面を隠す
Cend myDL; //メニュー画面
myDL.DoModal( ); //メニュー画面を表示
EndDialog(SW_HIDE); //ログイン画面を消去
}
else{
MessageBox ( パスワードが間違ってます);//メッセージボックスの表示
}
}
将来、password.txtを編集した時にまちがって改行をいれても大丈夫なように、
fgetsの後で、stringから改行文字を取り除くようにした方がいいと思います。
一例:
char *enter = strchr(string, '\n');
if(enter != NULL)*enter = '\0';
REEさんお度重なるお心遣い感謝いたします。
確かに“Text file”を編集するとき間違えないように
“ソースファイル”でコードを編集したほうがいいですね。
ありがとうございました。