“ログイン”が上手くできない

[戻る]
beginner 2005/05/13(金) 10:40:42
開発環境“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”です。

iijima 2005/05/13(金) 11:02:21
>    if(string == m_message ) //パスワードが一致したら

char型ポインタが指す文字列の比較は、==演算子ではできません。
この条件式は、左右辺の文字列を指すポインタの値が等しいときに真を返します。
文字列の比較については、strcmp関数を調べてください。

iijima 2005/05/13(金) 11:04:26
補足:
C++言語ならstringクラスが、また、MFC環境ならCStringクラスがあります。
それらのクラスオブジェクトとしての文字列なら、==演算子で比較できます。

beginner 2005/05/13(金) 11:10:36
iijima様ご回答ありがとうございます。
開発環境はMFCです。
strcmp関数を調べてみます。

REE 2005/05/13(金) 11:58:18
こういうときは、if文の前で両者を表示してみましょう。

m_messageがCStringであれば、==で比較できます。

それよりもstringの末尾に改行文字が付いているのかも・・

Blue 2005/05/13(金) 13:02:56
もしかしたら終端文字の領域がないのかもしれませんね。

>fgets(string,10,fp);
で10文字ちょうどの文字がとれるわけではないので。

例)
ファイルの内容
1234567890
の場合
stringには "123456789" という文字列が格納される。

でもやっぱりMFCつかっているならばCStdioFileとかを使ったほうがいいような。
# CStdioFileとかはマイナーなのかな。。。

初心者たち 2005/05/13(金) 13:09:03
あれっ、私はできましたけど・・・

何でかな!?

でも、初心者なので理由が分かりませ〜ん(泣)

beginner 2005/05/13(金) 13:32:37
[[解決]]
iijimaさんREEさん貴重なご意見ありがとうございました。
お二人のご教授により解決いたしました。

beginner 2005/05/13(金) 13:35:01
“初心者たち”さんあんまり責めないでください。
おかげさまで解決しました。
あっ!!Blueさんありがとうございました。

REE 2005/05/13(金) 14:29:18
どう解決したのか具体的な報告を期待します。

>“初心者たち”さんあんまり責めないでください。

別に責めているわけではないでしょう。

password.txtのパスワードの後に改行があるかないかで動作が変わったりしますので・・

beginner 2005/05/13(金) 14:52:24
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 ( "パスワードが間違ってます");//メッセージボックスの表示
    }
        
}

REE 2005/05/13(金) 15:37:09
将来、password.txtを編集した時にまちがって改行をいれても大丈夫なように、
fgetsの後で、stringから改行文字を取り除くようにした方がいいと思います。

一例:
char *enter = strchr(string, '\n');
if(enter != NULL)*enter = '\0';

beginner 2005/05/13(金) 16:42:34
REEさんお度重なるお心遣い感謝いたします。
確かに“Text file”を編集するとき間違えないように
“ソースファイル”でコードを編集したほうがいいですね。
ありがとうございました。

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