////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2003/12/08(Mon) No.235
    配信数： 2680 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

/*    Pubzine 読者の方へ - まぐまぐ移行のおねがい - （再掲）      */

　本メールマガジン、 KAB-studio.h は「まぐまぐ」と「 Pubzine 」の
２通りの配信サービスを利用させて頂いております。
　このふたつのサービスうち、 Pubzine が２００４年２月９日で終了いた
します。そのため、この日以降、 Pubzine で購読登録している方は
KAB-studio.h が配信されません。
　引き続き KAB-studio.h を購読登録したいという方は、お手数ですが
[まぐまぐの KAB-studio.h 登録画面 ]にて購読登録をしてください。

[ Pubzine 終了についてのおしらせ ]
http://www.pubzine.com/
[ Pubzine の KAB-studio.h 解除画面 ]
http://www.pubzine.com/detail.asp?id=590
[ まぐまぐの KAB-studio.h 登録画面 ]
http://www.mag2.com/m/0000012198.htm

Ｑ：かぶスタ側で移行してくれないんですか？
Ａ：こちらでは皆さんのメールアドレスはわからないので不可能です。
　　わかっても困るでしょ。
　　Pubuzine も「他に移管する」ということはないそうです。


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

・ほとはー１話追加
　三人合体ホットハーブに７の３を追加。いつの間にかツッコミ役？
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html

・新表紙！！
　やっとこさの新表紙です！！
　今回はバジルとハオシャオ。一応クリスマスっぽい感じでちょびっと色っ
ぽく。
　あ、今回のは壁紙バージョンはとりあえずないです。あとで何か作るかも
しれないけど……。
[ 表紙 ]
http://www.kab-studio.biz/index.html


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2003/11/30 (Sun)
　高い室内着。 Ever17 PE 、餓狼伝説、 SHORT CIRCUIT 到着。表紙描きま
した。バジルとハオシャオのツーショット。来週も大変だ。会社辞めたい。
餓狼伝説はきっこさんのうまさが光る……。

2003/12/01 (Mon)
　１０時に客先直出。修正につぐ修正。３時に寝る予定……。昨日の夜中は
本当に表紙描きました。液晶ディスプレイでＤＶＤを見よう計画。ドライブ
買うかな。そして転職コンサル。早！

2003/12/02 (Tue)
　午前中は客先行ってコーディング。午後はいつものレクチャーを受けに。
そしてまた客先へ。なんかのんびりと。そしてＤＶＤドライブ。外付けじゃ
ないと１万も安いのか。そしてクリスマス。休もう。そして情処。受けませ
ん。そして……詩はダメよ。

2003/12/03 (Wed)
　１週間ぶりにいつもの勤務地へ。外注さんへの仕様説明会。楽しい。向い
てると思うし。教育はお笑いに近いと思う。というわけで先生になります。
久々９時上がり。 Ever17 アンソロとか購入。

2003/12/04 (Thu)
　久々にいつもの業務。バグ報告したり、ケンカ売られたり。ガーッ！　理
不尽な引っ越し。７時に上がってＤＶＤマルチプラスドライブ購入。大きな
液晶ディスプレイでＤＶＤを見る。ソフトによってだいぶ違う。 SHOCK UP!
がいい感じ。寮の話。そのまま個人契約にできるかも。そして便秘。

2003/12/05 (Fri)
　今日もフォローまわりで終わる。９時上がりで横浜へ。三者三葉が面白
い。仕事の電話と寮の話と１５日の予定と。攻殻機動隊ＳＡＣに出てきたヘ
リがいい感じ。ナンバ歩きがブームなんですか？

2003/12/06 (Sat)
　洗濯してのんびり。２時から１１時半までおしごと。ぷらとわピンチ。そ
してナンバ歩き。国語の教科書！？


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第九章　四人　−１２−

『黄色き炎よ、瞬きを呼び覚ませ！！』
　赤葉の言葉と共に、空間にまばゆき光が現れる。
「ギャッ！」
「うわっ！！」
　部隊全員が目を眩ませる。総崩れとなった部隊めがけて、姿勢を低くした
まま掛ける雅樹。
「炎の守護者、朴雅樹、参る！！」
「な……ギャァアアア！！」
　雅樹の刀が指揮官の腕を斬り落とす。
「し、指揮官！？」
「うわぁぁぁあ！」
　発砲音が上がる。一斉に全員が銃を構え、阿鼻叫喚と発砲音が相互に鳴り
響く。
『赤き炎よ！』
『蒼き炎よ！』
　前後から炎が飛ぶ。体が赤き炎が包み、頭が蒼き炎で消し炭となる。
「あ、あ、あ……」
「さ、散開！！」
　誰かの声と共に、部隊は両翼に分かれる。生き残った２０名が二手に分か
れ、野原の外、木々の中へと入る。
　獣道ではない、ただの山野。開けているように見えて、それは天然の迷
路。
「あああ！」
「ギャッ！」
　その中に迷い込み、罠に掛かる。２０人の声は、あっという間に消えた。
「な……な……」
　草が焦げ、死体が転がる中、指揮官だけが腕の痛みに苦しみながらも、現
状をなんとか把握しようとしていた。その側に、雅樹が立つ。
「おっさんには色々訊きたいことがあるんだ」
　しゃがみ込む雅樹の顔を、おびえた目で見上げていた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あああ……』
「……」
『……お、お正月こそは……』
「……ダメみたいだよ」
『！！』
http://www.kab-studio.biz/index.html
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 12.12
構造体のファイル読み書き

「前回は、構造体のアライメントとパディングについて説明しました」
『構造体のメンバ変数が 8 バイトずつになっちゃう、それはプロジェクト
の設定で決められる、だよね』
「そう。それを踏まえて、構造体をファイルに書き込む場合について見て
みます」

struct TEST_STRUCT_DOUBLE_2
{
    char m_ch;
    double m_d;
    char m_ch2;
};

void WriteStructToBinaryFile()
{
    // ファイルを開きます。
    FILE *pstFile
        = fopen( "StructBinary.aaa", "wb" );
    if( !pstFile )
    {
        TRACE( "ファイルが開けない！\n" );
        return;
    }

    // 構造体を準備します。
    TEST_STRUCT_DOUBLE_2 stTEST_STRUCT_DOUBLE_2;
    memset( &stTEST_STRUCT_DOUBLE_2, 0x00, sizeof( stTEST_STRUCT_DOUBLE_2 ) );
    stTEST_STRUCT_DOUBLE_2.m_ch  = 63;
    stTEST_STRUCT_DOUBLE_2.m_d   = 2.0;
    stTEST_STRUCT_DOUBLE_2.m_ch2 = 63;

    // 構造体を書き込みます。
    fwrite
        ( &stTEST_STRUCT_DOUBLE_2
        , sizeof( stTEST_STRUCT_DOUBLE_2 )
        , 1
        , pstFile 
        );


    // ファイルを閉じます。
    fclose( pstFile );
    return;
}

「構造体は前回と同じ TEST_STRUCT_DOUBLE_2 です」
『 memset() で 0 にして、そのあとそれぞれの変数に入れて……あれ？　
この前って memset() に 0xAA セットしてなかったっけ』
「あれはパディングの部分を見るためのテストだから。本当はこうやって 
0 を入れるのが普通」
『確かに 0xAA ってちょっと変だもんね……』
「まぁ別に特別な理由はないから 0x00 以外でもいいんだけど、必要性がな
ければ 0x00 の方がいいかな」
『その次はファイルの書き込みね。使ってるランタイムは 
Version 12.09 ( No.232 ) と同じね』
「ここで重要なのは、 sizeof( stTEST_STRUCT_DOUBLE_2 ) の部分。前回
言ったように、ここにはパディングの分が入るから」
『見た目より大きなのになるってことだね』
「そういうこと。で、実際に、アライメントを 8 バイトにしてファイルに
書き込むと、次のようなデータになります」
『バイナリーモードで開いて、と』

3F 00 00 00 00 00 00 00
00 00 00 00 00 00 00 40
3F 00 00 00 00 00 00 00

『って、この前構造体の中身を見たときとほとんど同じじゃん。 AA が 00 
になったってだけで』
「そう、 memset() で 0xAA じゃなく 0x00 をセットしてるからね。でも、
それが重要」
『どゆこと？』
「構造体の中身がそのまま書き込まれるってことは、アライメントの設定次
第でファイルの構造が変わるってこと」
『あ……アライメントが 0 バイトだと、ファイルもパディングなくなった
状態で書き込まれるんだ』
「実際に試してみて」
『ほい。プロジェクトの設定で変えて、リビルドしてと』

3F 00 00 00 00 00 00 00 40 3F

『見事にパディングなくなっちゃった……』
「こんなふうに、アライメントの設定は実際のファイルの中身についても影
響します。さて、今度はこれを読み込んでみます」

void ReadBinaryFiletoStruct()
{
    // ファイルを開きます。
    FILE *pstFile
        = fopen( "StructBinary.aaa", "rb" );
    if( !pstFile )
    {
        TRACE( "ファイルが開かない！\n" );
        return;
    }

    // 構造体を読み込みます。
    TEST_STRUCT_DOUBLE_2 stTEST_STRUCT_DOUBLE_2;
    fread
        ( &stTEST_STRUCT_DOUBLE_2
        , sizeof( stTEST_STRUCT_DOUBLE_2 )
        , 1
        , pstFile 
        );
    TRACE( "%d\n", stTEST_STRUCT_DOUBLE_2.m_ch  );
    TRACE( "%.20f\n", stTEST_STRUCT_DOUBLE_2.m_d   );
    TRACE( "%d\n", stTEST_STRUCT_DOUBLE_2.m_ch2 );
    // 63
    // 2.00000000000000000000
    // 63

    // ファイルを閉じます。
    fclose( pstFile );
    return;
}

『ぱっと見いつも通り』
「ランタイムも今までのと同じだから特に問題ないよね」
『うん。ビルドして実行！　うん、ちゃんとデータ取れてる！』
「こんなふうに、構造体を使って読み書きをすると、 fread() や fwrite() 
を何度も使わずに複数のデータを読み書きできるっていうメリットがありま
す」
『あ、そういえば。 Version 12.10 ( No.233 ) のときはめんどくさかった
もんね』
「でも、実際のところ、構造体を使ってファイルの読み書きをするのはデメ
リットの方が多いかも」
『え、そうなの？』
「まずはさっきのアライメントの問題。今は、書き込むときも読み込む時も
アライメントは 1 バイトにしていました」
『……だから読み込めたけど、もし今、アライメントを 8 バイトにして、
さっきのファイルを開くと……』
「やってみて」
『う、うん……』

63
-925596313489040890000000000000000000000000000000000000(以下略)
-52

『あ”』
「という感じに、まったく開くことができません」
『でも、今の状態でファイルに書き込めば、それは読み込めるんだよね』
「うん、アライメントが 8 バイトで書き込まれるからね。でも……たとえ
ばプログラムがバージョンアップしたときとかに、うっかりアライメントを
変えちゃうと」
『う”、前のが読み込めなくなる』
「それに、アライメントの設定はプロジェクトの設定で変わるから、ソース
ファイルとバイナリーファイルだけ送って、それをビルドして実行すると」
『アライメントが違って読み込めない……』
「っていう場合が多々あります。そのほかにも、構造体で読み書きするのに
はいくつか問題があります」
『たとえば？』
「たとえば、クラスの問題。クラスには、継承の関係とかもあって、単純に
ファイルには書き出せないようになっています」
『そういう複雑な情報ってファイルに出せないの？』
「普通には無理。ところが、 Version 7.07 ( No.127 ) で説明したよう
に」
『そうよ、構造体とクラスってほとんど同じなんじゃない？』
「だから、構造体だからって簡単にファイルに書き込むのはちょっと、って
いうことがあるから」
『やっぱ書き込むのはダメ、ってことね』
「ただ、複数のデータをまとめて書き込めるっていうのは便利だし、以前は
こうやって書き込むのは普通だったから」
『……結局どっちなの！？』
「えーっと……とりあえずは、構造体を直接書き込むのはしない方向で。で
も、仕組みとか方法は憶えておいて」
『その以前の、とかの関係？』
「そういうこと。昔のを使うときにはね。あと、構造体で書き込んでも、読
み込む時には構造体を使わない、っていう方法もあります」
『どゆこと？』

void ReadStructBinaryFile()
{
    // ファイルを開きます。
    FILE *pstFile
        = fopen( "StructBinary.aaa", "rb" );
    if( !pstFile )
    {
        TRACE( "ファイルが開かない！\n" );
        return;
    }

    char ch;
    double d;
    char ch2;
    fread( &ch, sizeof( ch ), 1, pstFile );
    fread( &d, sizeof( d ), 1, pstFile );
    fread( &ch2, sizeof( ch2 ), 1, pstFile );
    TRACE( "%d\n", ch  );
    TRACE( "%.20f\n", d   );
    TRACE( "%d\n", ch2  );
    // 63
    // 2.00000000000000000000
    // 63

    // ファイルを閉じます。
    fclose( pstFile );
    return;
}

「あ、 fread() でべたに読み込んでる」
『ただ、これはアライメントが 1 バイトの場合の処理』
「 8 バイトの場合には？」
『ランタイムに fseek() っていうのがあって、これだとファイルポインタ
を自由に移動できるから』
「パディングを飛ばせる？」
『そういうこと』

/*
    Preview Next Story!
*/
「バイナリーデータ編は次回で最後です」
『細かいルール多かったね』
「だから次回はそのまとめ」
『というわけで次回』
＜ Version 12.13 バイナリーのまとめ ＞
「につづく！」
『お、今回は全１３回！』
「というか、文字列編が長すぎたね……」


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

・ ほとはー１話追加予定
　三人合体ホットハーブに７の４を追加予定。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2003 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

