{magclick}
{magclick}
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2000/09/25(Mon) No.075
    配信数： 3860（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/
{magclick}

/*              ２０００年９月２５日（月）の更新                  */
http://www.kab-studio.com/

・表紙を９月バージョンに！
　なーんか、夏休みは変則的な更新になったため、今さら９月表紙の公開で
す（汗）。
　今回は結構いい感じにできたかなと。壁紙バージョンもあります。ダウン
ロードは CG Gallery にて。

[CG Gallery]
http://www.kab-studio.com/CG/Gallery/

・プログラミング辞書「ごめんなさい」制度廃止
　プログラミング辞書では、これまで「追加できない単語」の場合には「ご
めんなさい」欄に理由を付けて掲載していましたが、送信数が膨大に増えた
ことにともなって「ごめんなさい」な単語が大幅に増えてしまったため、処
理しきれないくらいになってしまいました。
　なので、これからは「ごめんなさい」制度を廃止することにします。なの
で、追加されてなかったら「ダメだったんだな」と判断してください。
　追加されなかった理由が分からない場合などには鏑矢の憂鬱にてお送りく
ださい。


/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2000/09/17 (Sun)
　ドラクエが中心（爆）。あと、目指せヒモ生活？　鏑矢正伝がその間違っ
た恋愛観を語る！！

2000/09/18 (Mon)
　貯まってるビデオ見たりドラクエしたり。そして「楽しい」ということに
ついて。自分を愛せない人は他人を愛せないのさっ。

2000/09/19 (Tue)
　久しぶりに所沢古本まつりへ。ラーメン屋潰れてる？　掘り出し物も結構
あったっぽい？

2000/09/20 (Wed)
　ドラクエしたり。そして陽だまりの樹の最終回。全体通すと、かなりいい
感じの内容だったと思うです。コミックスも買おうかなー。

2000/09/21 (Thu)
　９月表紙完成！　ＣＧの描き方に興味があるあなたのために経過詳細も掲
載！　って、ただの自己満足って気も（汗）。あと祝２１万ヒット〜。

2000/09/22 (Fri)
　いきなしツッコミが２５００通も送られてくる（汗）。ゼミのレポート作
成とドラクエ。そして、今が旬の柔道を、護身術として売り込みます！　短
期間で強くなりたい人必読。

2000/09/23 (Sat)
　オリンピックの野球とサッカー見てて疲れた……。


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

2000/09/17 (Sun)
お休み

2000/09/18 (Mon)
お便り
gcc のオプションはどうやって調べるの？
gcc の本を読むのが一番楽そう
インターネットで調べると見つかりすぎて大変

2000/09/19 (Tue)
Ｃマガジンよりもインサイドウィンドウズの方が良かった
プラットフォームが限定されている方が具体的でいい
FFT についての記事を Codian でも書く予定だった
でも無理そう

2000/09/20 (Wed)
お休み

2000/09/21 (Thu)
お休み

2000/09/22 (Fri)
お休み
質問送って

2000/09/23 (Sat)
お便り
256 色時にビットマップ表示が遅くなる
LoadImage() とかが原因？
ビットマップ関係は詳しくないからよく分からない
メモリデバイスコンテキストを使って転送してみたらいいかも
お便り
SetWindowsHookEx() が失敗する
第４引数にスレッド ID を渡すとうまくいくかも


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
WIN32 WIN32API SSI Context Monitor typedef

・今週の状況：
goo のデータベースから消えちゃった関係で、ヒット数激減、送信数激減。
でもこれはこれでいいかも（爆）。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『２７日、いよいよ最終回！』
「１０月からは再放送が始まります」
『 Codian 化は？』
「……」
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 5.10
ifstream をもっと使う！

「この前は、ファイルからデータを読み取る方法を簡単に見てみました」
『 ifstream ってゆーの使ったんだよね』
「そう、こんな感じ」

void CFileTestDlg::OnBtnShow() 
{
    int i;
    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );
    cIFStrm
        >> i;

    char chDest[256];
    sprintf( chDest, "%d", i );
    m_cDataLstBox.AddString( chDest );
}

「この関数には色々問題があるから、その辺を改良していきます」
『ん？　ぱっと見問題なさそうだけど』
「まず Data.txt がなかったときの問題」
『え〜？　あたしが Data.txt 作ったんだからないわけないでしょ』
「今回はね。でも、このアプリは〈ファイルを指定して読み込む〉機能も着
けるから。ダイアログに【参照】ボタン着けたでしょ」
『そういえば。つまり開いたファイルがあるかどうかチェックしなきゃいけ
ないわけね』
「そこで、 std::ifstream::fail() というメンバ関数を使用します」
『あ、ちょっと待って、 クラス名とメンバ関数の間の :: って、名前空間
の？』
「うーん、微妙なとこだね。基本的には違うけど、使い方は似てるかな。
ま、クラス名が苗字、メンバ関数が名前って考えると似てるでしょ」
『まーねー』
「同じ名前のメンバ関数が違うクラスにあったりするから、こういうふうに
フルネームで書くのがいいかな。さっきの CFileTestDlg::OnBtnShow() み
たいに、定義部はこういうふうに書くし」
『 ifstream::fail() でただひとつのメンバ関数を示せるってことね。じゃ
あ std:: は？　これも付けた方がいい？』
「人に寄りけり。 ifstream は有名だから、付けなくても標準 C++ ライブ
ラリのだってことは分かるんだけどね」
『水希ちゃんが付けてる理由は？』
「クセかも」
『クセ、ねぇ……』
「ま、ぱっと見でこっちの方が分かりやすいと思うんだけどね。っと話を戻
して」
『 std::ifstream::fail() だよね。そいや fail って〈失敗〉とかの意味
だよね』
「そう、 std::ifstream::fail() を呼び出すと、ファイル名が開けていた
場合には false が、開けなかった場合には true が返ってきます」
『ん？　前教えてもらったのって TRUE って大文字だったけど』
「そうそう、 Ver 3.11 ( No.036 ) でやった TRUE と FALSE と、ほとんど
同じ。簡単に言えば、 true と false は新しいので、 TRUE と FALSE は古
いの」
『ふと思ったんだけど、大文字ってことは、 なんかの別名なの？』
「当たり！　Ver 5.08 ( No.073 ) でやったね。 FALSE は０、 TRUE は
０以外を置き換えたもの」
『な、なにその〈０以外〉って！』
「 if と同じってこと」
『あ、そういえば、 if は０以外だと入って、０だと入らないんだよね』
「それに合わせているんだけど、実は TRUE の値って、決まってないんだよ
ね」
『０以外、だもんね』
「それだと困っちゃうからできたのが、 true と false 。これは 1 と 0 
って決まってるから使いやすいわけ」
『でも、２種類あると混乱するなー』
「確かにそうかも。混ぜて使うのはちょっと不安かも。ま、自分でプログラ
ム組むときには true と false がいいかな」
『はーい。で、 std::ifstream::fail() ってどう使うの？』
「  std::ifstream::open() のあとに呼び出せばＯＫ」

    cIFStrm.open( "_Data.txt" );
    if( cIFStrm.fail() )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

「確認のために _Data.txt ってファイルを開こうとしてみます」
『ないわけだから、 cIFStrm.fail() で……えっと、 true が返ってくるん
だから、それだと１だから if の中に入るんだよね』
「で、ファイルがないってことを知らせて、そのあと何もせずに関数から抜
けます」
『でもちょっと無味簡素よね〜』
「その辺はアイディア次第。実際は TRACE() じゃなくて、ダイアログを表
示したり、もう一度読み直してみたり、とか色々な方法があるから」
『つまり、それをどうするか、あたしが決めなきゃいけないんだ』
「そういうこと。ま、アプリのデザインの部分だね」
『なんかそーゆーのも難しそう……』
「ま、本来はプログラマーの仕事じゃないとは思うんだけどね。さて次。前
回 std::ifstream の >> 演算子は改造されてるって言いました」
『うん、ファイルからデータ取り込んで i に入れてくれるの』
「実は、文字配列にも入れてくれます」
『そういえば、ファイルに入ってるのって文字列そのものなんだから、当然
って言えば当然よね。……って、もしかしてそれって、 sprintf() 要らな
いってことなんじゃない！？』
「その通り！」

void CFileTestDlg::OnBtnShow() 
{
    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );
    if( cIFStrm.fail() )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }
    char chDest[256]; 
    cIFStrm
        >> chDest;
    m_cDataLstBox.AddString( chDest );
}

「ってすると、  i じゃなく chDest に、文字列として書き込まれます。も
ちろん」
『 sprintf() 必要なし！！　むっちゃ無駄骨〜』
「でもこれは問題もあるよ」
『どゆこと？』
「今回の目的は、ファイルから整数値を読み込んで、それをリストボックス
に表示すること。これだと、ファイルに整数値以外が入ってたら？」
『表示しちゃう？』
「そういうこと。だから、ファイルの中に入ってるデータが、整数値かどう
かチェックしないと」
『おー』
「 chDest に入れてから中に整数値が入ってるかどうか調べてもいいんだけ
ど、それより今回は、 cIFStrm の機能を使ってチェックします。なんで、
元に戻します」
『うお、無駄骨！』
「 cIFStrm >> chDest って読み取る場合には、ファイルに何が書かれてて
も読みとれるでしょ」
『テキストファイルの中身は、文字列そのものだもんね』
「 cIFStrm >> i の場合には、文字列として読み取って、それを整数値に変
換しなきゃいけない」
『その変換できない場合を、さっきみたいに if で拾って return すればい
いんじゃない？』
「そういうこと！　しかも、さっきと同じ std::ifstream::fail() を使え
ばＯＫ」

    cIFStrm
        >> i;
    if( cIFStrm.fail() )
    {
        TRACE( "整数値じゃないです\n" );
        return;
    }

『ホントだ、さっきのファイル開いたときと同じ』
「 std::ifstream::fail() はいろんなエラーチェックができるから。ちな
みに、実際にこれが機能するかどうか調べるときは、 Data.txt の最初に整
数値以外の文字列入れれば確かめられるから」
『〈あ〉とか入れればいーよね。ビルドして実行、うん if の中に入った』
「さて最後。その Data.txt に整数値３つを入れたよね。この３つ全部を読
み取る方法を見ていきましょう」
『あ、３回繰り返せばいいから for 使うんでしょ』
「ぶぶー。確かに今回は３個だけど、ファイルによって違う、ってことにす
ると？」
『３個って決められないんだ。ってことは、ファイルにあるの全部読み取る、
とかできればいいんだよね』
「そういうこと」

    cIFStrm
        >> i;
    cIFStrm
        >> i;
    if( cIFStrm.fail() )    // 以下略。

「ってするとどうなる？」
『ビルドして実行。あ、 200 って出た。ってことは、 >> を繰り返すと、
どんどん読み取ってくってこと？』
「そういうこと。 cIFStrm の中に〈ファイルを指し示す針〉があって、
>> を使うと、針の位置にあるデータを読み込んでから、針を次のデータの
所まで進める、っていうシステムになってるんです」
『便利ねー。あ、その針が、ファイルの端っことかまで行ったのが分かれば
いいんだよね』
「そういうこと。それを調べるメンバ関数が std::ifstream::eof() 」
『いーおーえふ？』
「 eof は End Of File の略、つまりファイルの最後ってこと」
『おお』
「ファイルの最後に来たら、このメンバ関数が true を返します。というわ
けで、これを while につかうと、こうなります」

void CFileTestDlg::OnBtnShow() 
{
    int i;
    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );
    if( cIFStrm.fail() )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

    while( !cIFStrm.eof() )
    {
        cIFStrm
            >> i;
        if( cIFStrm.fail() )
        {
            TRACE( "整数値じゃないです\n" );
            return;
        }
        char chDest[256]; 
        sprintf( chDest, "%d", i );
        m_cDataLstBox.AddString( chDest );
    }
}

『ビルドして実行、おー、 100 200 300 全部リストボックスに出た！』
「この辺が、ファイル操作の基本かな」

/*
    Preview Next Story!
*/
『ねー、今回のって STL & iostream 入門の iostream のNo.11 と同じ？』
「ほとんど同じ。向こうはやや上級者向けだから解説は簡単だけどね」
『ってことは、こっちは初心者向け？』
「 if の復習とかしてたらやっぱ初心者でしょ」
『う”』
「というわけで次回」
＜ Version 5.11 ランタイムでファイル操作！ ＞
『につづく！』
「火美ちゃんもちゃんと復習しないとね」
『分かった、ちゃんとする、復讐』
「字が違う！！」


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

const メンバ関数
#07 const メンバ関数が呼べない

　たとえばこんな感じの const メンバ関数。

    int GetData() const
    {
        return GetDataTrue();
    }

　const メンバ関数の GetData() から、同じクラスの private メンバ関数
GetDataTrue() を呼び出しているところ、っていう場面。この GetDataTrue() 
は、 const メンバ関数である必要があります。もし非 const メンバ関数な
らコンパイルエラーになります。
　GetData() を呼び出す場面を想像してみてください。 GetData() は const
メンバ関数だから、呼び出す側は「値が書き換えられない」と考えます。そ
れを保証するためには、 GetData() の中で呼ばれるメンバ関数も、値が書
き換えられないことを保証する必要があります。もし値が書き換えられたら、
GetData() が const メンバ関数だっていうのは嘘っていうことになってし
まいます。嘘を付かないために、 GetData() からは const メンバ関数しか
呼べないことになっているんです。

　つまり「 const メンバ関数から呼べる自クラスのメンバ関数は、 const 
メンバ関数のみ」ということです。このために、メンバ関数に「グループ分
け」のようなものが生まれます。
　public メンバ関数が const か非 const かによって、呼べるメンバ関数
が変わります。非 const は const も非 const もどちらも呼べるけど、
const は const しか呼べません。また、たとえ public な非 const メンバ
関数を呼び出すとしても、そのあと const メンバ関数を呼び出したらそれ
より深い位置では再び非 const メンバ関数を呼び出すことができないんで
す。この辺は木構造みたいなのを想像してみると分かりやすいかな。

　メンバ関数を const にするか非 const にするかは、クラスの設計段階の
問題です。ところが実際にはこれは実装方法によって大きく左右されるんで
す。どのメンバ関数からどのメンバ関数を呼び出すか、ということをしっか
りと決めておかないと、 const メンバ関数を使うことができなくなってしま
うでしょう。来週は具体的な例について見てみます。じゃね。


/*              ２０００年１０月２日（月）の更新予定              */
http://www.kab-studio.com/

・予定なし
　もしかしたら１０月表紙を更新してるかも（爆）。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www.kab-studio.com/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

    (C)KAB-studio 1999 - 2000 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/


/*                      See you next week!!                      */


