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

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

    送信日： 2000/10/30(Mon) No.080
    配信数： 3850（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

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

・ Codian - iostream に追加！
　Codian の iostream にページを追加！
　今回は「 STL & iostream 入門」の中から iostream の #05 と #06 を追
加。 std::strstream でのポインタ操作についてです。しかも図入り、その
うえメルマガでは間違っていた部分も改変しています。
[Codian]
http://www.kab-studio.com/Programing/Codian/


・KAB-studio.h 縮刷版更新
　メールマガジン KAB-studio.h が８０号に達したので縮刷版を更新！　最
近読み始めた方におすすめ。って、最近購読登録数全然増えてないんですけ
ど（汗）。
　ダウンロードはフリーウェアインフォメーションルームにて。
[フリーウェアインフォメーションルーム]
http://www.kab-studio.com/Freeware/


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

2000/10/22 (Sun)
　突発企画・超４択アンケートがスタート！！　バカな企画だ（爆）。読者
参加型だからみんな来てねー。あとはテレビ色々。

2000/10/23 (Mon)
　ギルティギア購入！　立川にできたゲーマーズにありました。やっぱプレ
ステだからなぁ（汗）。そして大喜利ふたたび。

2000/10/24 (Tue)
　ギルティギアしたりまんがの設定描いたり。まんがはちょっとだけ本気で
す。それにしてもわてって対戦格闘好きよね、とゆー話。

2000/10/25 (Wed)
　ゼミの NT サーバーのセットアップを手伝いに行く。しかーし役に立た
ず（爆）。知識ないからしゃーないねん。

2000/10/26 (Thu)
　今日はピアノ運び。なんか毎日結構違う日常送ってるなー。そしてあずま
んが大王２巻発売直前。

2000/10/27 (Fri)
　今日はやっぱあずまんが大王２巻発売記念でしょう。いやマジ面白いって。
とりあえず今世紀一番くらいは。あといい電子も面白かった。まんがってい
いよね。

2000/10/28 (Sat)
　変な夢見る。わては結構夢を憶えてる方なんで、朝方に夢日記書くクセ付
けたらそれだけでベストセラー＜ベストセラー？　あとテレビ色々。英語せ
ねば。なぜかわては「英語できそうな人」に見られること多し……。


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

2000/10/22 (Sun)
就職前研修
UNISYS の「プログラミングの基礎」という CD-ROM
設計方法やフローチャートについて
言語非依存
例は VB
情報処理２種レベルの方が大変
古いことも知らないといけないから

2000/10/23 (Mon)
お便り
Active X の本
Inside OLE 
C MAGAZINE 
COM は「クラスプラグイン」の実装方法のひとつ
仮想関数を関数ポインタの代わりに使う
COM と同じシステムを作ってみるといいかも

2000/10/24 (Tue)
お休み

2000/10/25 (Wed)
お便り
UNICODE でファイル読み込み
サンプルコード
文字化けする
_T( ) マクロを使った方がいいかも
OS によっては使えない可能性が
表示方法
バイナリーで比べてみるのがいいかも
お便り
SDK でのメッセージ送信
ControlBar っていうコントロールがある
ユーザー定義メッセージは CWnd::WindowProc() が楽かも
WM_USER の値は決められている
別アプリに文字列を送るのは面倒

2000/10/26 (Thu)
お便り
UNICODE の問題解決
CArchive.ReadString()

2000/10/27 (Fri)
お休み

2000/10/28 (Sat)
辞書書き
Windows Template Library 


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

・追加単語：
ACM ANSI BNF dynamic_cast EBNF ID LALR 構文解析 LL 構文解析 
LR 構文解析 MCI WTL イベントドリブン 意味解析 オートマトン 下降解析
キーワード 言語処理 構文解析 コード コンパウンド 再帰下降解析 識別子
字句解析 上昇解析 状態遷移図 正規表現 前方参照 ビルド ファイルサイズ
ブロック構造 ベクター 有限状態オートマトン 予約語 

・今週の状況：
　今回は３０単語以上追加しました。そして総単語数も 601 に！
でも今回はちょっと疲れた（汗）。も少し単語数少ない方がいいかも。


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

const メンバ関数
#12 クラス設計と const メンバ関数

　C++ でプログラムを組む場合には、まずクラス設計を先にすると思います。
オブジェクト指向設計を使って図を書いて、それをクラス化して実装する。
　ここに const メンバ関数を導入することは、難しいでしょ。 const メン
バ関数は実装部に大きな影響を与えると同時に、シグネイチャーとしても書
かなきゃいけない、つまり設計段階と実装段階の両方に影響力を持つんだか
ら、設計をまずするってことがそもそも不可能になっちゃいます。
　そうなってくると、 const メンバ関数を使うことは、現実的に不可能、
ってことになります。特に何人かでプログラムを組む場合とか、設計と実装
を別の人がする場合とかにはどうしようもなくなります。設計がめぐるまし
く変わるか、 mutable の嵐になるか。どっちにしても、結果は目に見えて
ます。
　でも const メンバ関数のメリットは計り知れないものがあるよね。 
const メンバ関数を実装して、さらに const ポインタと const 参照を使う
ことで、メンバ変数が書き換えられる範囲を狭めることができるから、デ
バッグするときにものすごく楽になります。プログラムが大きくなればなる
ほど、このメリットが分かるはず。 C++ を使う以上、 const メンバ関数を
使わない手はないでしょう。
　もし const メンバ関数を設計段階から問題なく使う方法があれば、と思
うんだけど、それは難しいかな。ちょっと職人的な技術が必要になりそう。
私自身、この問題には答が見つかってない状態。
　……結局、結論としては「 const メンバ関数は使うのが難しい」ってこ
とになっちゃうかな。だから使ってる人は少ないし、 C++ にしかないし。
でも、そのメリットを考えると、捨てきれないものがあるのよね。もしいい
方法が見つかったら、紹介しますね。
　来週からは、 C++ にしかない魅力的な、でもあまり使われていないもう
ひとつの機能、テンプレートについて紹介していきます。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『なんか新企画始まったみたいねー』
「アンケート、っていうよりはお笑い系みたいだけど」
『えーなになに、〈目の前に幽霊が！　そのときあなたは？〉？』
「僕は」
『〈はにゃ〜ん〉とか言ったら殺す』
「な、なぜに……」
『やっぱ〈志村、うしろ、うしろ！〉でしょう』
「ってそんときまだ生まれてないでしょ」
『電子生命体にとって記憶面での年齢は意味ないのよ、ふふん』
「次の質問は〈テスト終了５分前！　そのときあなたは？〉だって」
『そーゆーときってむしょーにトイレいきたくなんない？』
「そんな回答はないけど」
　というわけで、さっそくあなたも投票しよう！！
http://www.pubzine.com/detail.asp?id=590
_______________________________________________________________[KCM]


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

　Version 5.15 
API でファイル操作

「というわけで、今回は API を使って読み込んでみます」
『 iostream にランタイムに MFC 、とどめに API ね』
「ただ、かなりややこしいから覚悟するように」
『げげ』
「まず、この前の MFC の例みたいに、 CFileTestDlg::OnBtnShow() の最初
の部分にプログラムを書いて、 return で終了させて、そのあとに iostream
のプログラムを取っておく形にします」
『 MFC のは削除しちゃうのね』
「そういうこと。で、次のようなプログラムを書き込んで」

void CFileTestDlg::OnBtnShow() 
{
    // ファイルを開きます。    
    HANDLE hFile
        = CreateFile
            ( "Data.txt", GENERIC_READ, 0, NULL
            , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if( hFile == INVALID_HANDLE_VALUE )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

    char chAllLine[1024];
    if( 1024 < GetFileSize( hFile, NULL ) )
    {
        TRACE( "ファイルが大きすぎます！\n" );
        CloseHandle( hFile );
        return;
    }

    DWORD dwReadedSize;
    BOOL bRes
        = ReadFile
            ( hFile, chAllLine, 1023
            , &dwReadedSize, NULL );
    if( bRes == 0 && dwReadedSize == 0 )
    {
        TRACE( "ファイルから読みとれませんでした。\n" );
        CloseHandle( hFile );
        return;
    }

    std::istrstream cStrStrm( chAllLine, dwReadedSize );
    while( !cStrStrm.eof() )
    {
        int i;
        cStrStrm
            >> i;
        if( cStrStrm.fail() )
        {
            TRACE( "整数値じゃないです\n" );
            CloseHandle( hFile );
            return;
        }
        char chDest[256]; 
        sprintf( chDest, "%d", i );
        m_cDataLstBox.AddString( chDest );
    }

    CloseHandle( hFile );

    return;
// 以下、 iostream のプログラムを取っておきましょう。

『な、なが〜い！！』
「ホント、長いよねぇ。僕も普段は API でファイル操作ってしないから、
もう少し簡単にする方法があるのかなーとは思うんだけど、これが限界」
『なさけなー』
「でも、プログラムが部分部分の集まりなのは同じ。というわけで少しずつ
見ていきましょう」

    // ファイルを開きます。    
    HANDLE hFile
        = CreateFile
            ( "Data.txt", GENERIC_READ, 0, NULL
            , OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if( hFile == INVALID_HANDLE_VALUE )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

『あ、いつものファイル開くとこでしょ。でも CreateFile() って、ファイ
ル作ってるの？』
「ううん、 CreateFile() って API はファイルを作ることだけじゃなくて
開くこともできるから。意味的には〈ファイルを操作するためのものを作る〉
って考えた方がいいかも」
『なんか複雑』
「 CreateFile の次の２行が引数」
『ひとつめは開くファイル名でしょ、ふたつめは CFile::modeRead とかと
同じフラグだよね』
「そう、その辺も MSDN の CreateFile() のリファレンスに書いてあるから」
『え〜？　ぱっと読んだけどむっちゃ難しかったよ！？』
「あれは確かにね……。ま、ここで大まかに憶えて、リファレンスでフラグ
や引数の意味を調べる、くらいに使った方がいいかな」
『うんそうするー。みっつめは……共有？』
「このファイルを開いている間、他のアプリがこのファイルを開けないよう
にすることができるから。そういうのを指定するフラグをここに渡します」
『今回はそゆことしないから 0 ね。次の子プロセスって？』
「これは難しいからパス」
『だから NULL を渡すっと。２行目の OPEN_EXISTING はフラグっぽいね』
「この引数はファイルがなかったときにどうするかを決めるフラグ。この 
OPEN_EXISTING は〈ファイルが存在しなかったらエラー〉にするフラグ」
『 CREATE_NEW だと新しく作る、そっか、こっちなら〈ファイルを作る〉に
なるんだね。 FILE_ATTRIBUTE_NORMAL もフラグだね』
「こっちはファイルの状態。隠しファイルかとか読み取り専用かとか、ファ
イルをフォルダで右クリックして出るメニューの〈プロパティ〉のだね」
『あー、あれか。 FILE_ATTRIBUTE_NORMAL は普通のファイルってことね』
「最後も難しいからパス」
『だから NULL 。この〈難しい〉ってどんな感じに難しいの？』
「この辺のは〈ウィンドウズの機能〉に深く関わってる部分だから。ウィン
ドウズシステムを理解するのは難しいからね」
『そーゆーもんなんだ』
「引数は以上。戻り値は HANDLE 型」
『何この型は。あ、ハンドルって言ったらウィンドウハンドルとかそういう
のあったよね』
「それと同じ。さっき〈ファイルを操作するためのものを作る〉って言った
でしょ。これを操作するためのハンドルが返ってくるって考えればいいかな」
『でもさ、普通 HFILE 型とかじゃない？』
「それがないんだよね。リファレンス見れば分かるけど、 CreateFile() は
ファイル以外のも開けるから、そのために HANDLE 型っていうあいまいな型
を使ってるんだよね」
『……それってヤバくない？』
「かなりまずいよね。 API って OS やハードウェア寄りの細かい操作がで
きるように設計されてるからこうなってるんだけど、その分使い方を誤ると
まずいことになるね」
『はー、なんか怖いね』
「正直な話、今ここで API でファイル操作する方法教えてるけど、もっと
C++ 言語を憶えるまでは API でしないほうがいいかもね」
『それはそうねー、使い方とか間違えてたら怖いもん』
「ま、そうは言っても壊すくらい無茶しないと分からないこともあるけどね」
『無茶したことあるんだ』
「まーね。で、話を戻すとこの戻り値 HANDLE 型を使って、これからファイ
ルを操作していきます。そういうのあったよね」
『ランタイム使ったときのファイルポインタ！　あれも fopen() の戻り値
だったよね』
「そう同じ。で、ファイルを開くのに失敗してたら INVALID_HANDLE_VALUE
って値が返ってくるから」
『それを if でチェックね』
「この辺もランタイムと同じだね。そうそう、同じって言ったら、最初のプ
ログラムの最後の方にこの行があるでしょ」

    CloseHandle( hFile );

『 fclose() と同じ？』
「そういうこと。 API も関数だから、わざわざこういうふうにファイルを
閉じなきゃダメ」
『クラスならそういうことしなくていいんだよね』
「クラスには〈自動的に関数を呼びだしてくれる機能〉があるから、その関
数の中で閉じればいいからね」
『……んーと、質問！』
「はい火美ちゃん」
『ぶっちゃけた話、なんで API だとこんなめんどいの？』
「さっきもちょっと触れたけど、 API は OS やハードウェアの機能を使え
るようになってて、その細かい機能を使うために引数がいっぱいあるわけ」
『ってことは、 iostream やランタイムとか MFC じゃ、そういうの使えな
いってこと？』
「そういうこと。 iostream は〈標準 C++ ライブラリ〉、ランタイムは
〈標準 C ライブラリ〉って呼ばれるものの一部。標準だから、他の開発環
境や OS でも使われます」
『そういうのに OS の操作する機能付けても、実際に OS が対応してないか
もしんないってわけ？』
「それが標準ライブラリのスタンスってことだね。汎用的に使えるようにし
たいから、細かい機能はなし、ってこと」
『その細かい機能って具体的にゆーと？』
「たとえばさっき言った〈隠しファイル〉とか〈読み取り専用〉とかのプロ
パティ。 OS によってはああいう設定がファイルにはないからね」
『ふ〜ん。ふたつめの質問！』
「はい火美ちゃん」
『水希ちゃんが書いたプログラム、なんで = や ( や , が最初に来るよう
にしてるの？』
「あー、あれはね」

    HANDLE hFile = 
        CreateFile( "Data.txt", GENERIC_READ, 0, NULL, 
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

「ってなってたら〈前の行から続いてる〉って分からないでしょ。プログラ
ムはどの行も左から読み進めるから、まず = や , が出てきたら前の行から
の続きだなって分かるように」
『インデントがあるじゃん』
「インデントは信用しないっていうのが僕のスタンス」
『こだわりってことねー』
「……別に真似しなくたっていいよ、他に誰もしてないから」
『んー、考えとく。改行やたらと多いのは？』
「これはただの見やすさかな。引数の部分だけまとめたいとか、横に長いよ
りも縦に長い方が読みやすいとか」
『それはよく分かんない……』

/*
    Preview Next Story!
*/
『でもホント、 API って面倒ね』
「ファイル操作は iostream とかあるからまだいい方だけど」
『ってことは、 API しか方法がないっていうのも多いの？』
「いーっぱいあるよ」
『げげ』
「というわけで次回」
＜ Version 5.16 API で読み取る！ ＞
『につづく！』
「ま、 iostream も〈他の人が作ってくれた〉ってだけだけど」
『 API だけのも誰かが作ってくれればいいわけだ』
「コンピューターが自動的に作ってくれると楽なんだけどね〜」
『……なんであたし見るのよ』


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

・Codian-STLに追加！
　CodianのSTLにページを追加します！
　今回は「 STL & iostream 入門」の中からSTLの#06〜#09を追加。今回も
もちろん図入りです！

・表紙を１１月バージョンに！
　毎月恒例、新しい表紙です。って、まだラフも描いてないやん（汗）。し
かも１１月ってネタに困るし。どないしょ。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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!!                      */
