#pragma twice

KAB-studio > プログラミング > #pragma twice > 233 Version 12.10 複数のバイナリーデータの読み書き

#pragma twice 233 Version 12.10 複数のバイナリーデータの読み書き

前のページへ 表紙・目次へ 次のページへ

 Version 12.10
複数のバイナリーデータの読み書き

今回は、前回の補足的な部分を見ていきます
前回の補足?
まず、複数のデータを書き込むって処理をします
そういえば前回は int だけだったね
ま、実際のところ難しいことは何もないんだけど

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

    // 0x0000ABCD を書き込みます。
    int i = 0x0000ABCD;
    fwrite( &i, sizeof( i ), 1, pstFile );

    // 実数 2.0 を書き込みます。
    double d = 2.0;
    fwrite( &d, sizeof( d ), 1, pstFile );

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

ホント、 fwrite() 呼ぶのが2回になったってだけね
 fwrite() だけじゃなく、 fprintf() とか fputc() もそうだけど、書き
込む度に〈次に書き込む位置〉が進むから、どんどん書き込めば後ろに追加
していくからね
それって前に言ってた、別の意味の【ファイルポインタ】のこと?
そういうこと。 Version 5.12 ( No.077 ) でやったね
あのときは読み込みのだったけど
これは読み書き両用だからね。さて、これでファイルに書き込めたから、
実際にファイルを見てみます
前回と同じ、バイナリーで見ればいいんだよね
そう
ん、こんな感じに入ってたよ

000000  CD AB 00 00 00 00 00 00  00 00 00 40

先頭4バイト、つまり

CD AB 00 00

までが i を書き込んだ部分
これは前回と同じね。ってことは、その後ろが
 d を書き込んだ部分

00 00 00 00  00 00 00 40

の8バイトだね
……って、この前教わったのと継ながらない……
 i と同じくバイトオーダーがあるから
前後逆だし、ビット単位じゃないとわかんないね
ま、それは仕方ないかな int に比べれば、 double を直に見て数値に変
換する、ってことはあまりないと思うし
だねー
では次に、このファイルを読み込んでみます
お。これも前回やってないね
でも、ほとんど同じだけどね

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

    // int を読み込みます。
    int i;
    fread( &i, sizeof( i ), 1, pstFile );
    TRACE( "0x%08X\n", i );
    // 0x0000ABCD

    // double を読み込みます。
    double d;
    fread( &d, sizeof( d ), 1, pstFile );
    TRACE( "%.20f\n", d );
    // 2.00000000000000000000

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

なんか対称って感じ
まず、 fopen() 

        = fopen( "2Binary.aaa", "rb" );

読み込みだから、 w が r になってるんだね
あと、書き込みがバイナリーモードだったから、読み込みもバイナリー
モード。次は、読み込み部分

    fread( &i, sizeof( i ), 1, pstFile );

 fwrite() が fread() だね
 fread() はファイルからデータを読み込むランタイム。引数とかはほと
んど fwrite() と同じだから、説明の必要はないかな
楽ねー。そのあとは一緒ね
そう。こうやってみると、バイナリーの読み書きって簡単でしょ
うん、簡単! って、前回とか、テキストの方がいいって言わなかったっ
け?
今の例は簡単だからね。自分のアプリで書き込んで、自分のアプリで読み
込むから
それはこの前聞いたけど、それが普通なんじゃない?
そうだね。もうひとつあげると
テキストで修正できないって言うけど、それはそれでメリットなんで
しょ?
それも場合によるかな。今は簡単に作れたけど、たとえば、ファイルに書
き込む部分を作るのにとても時間が掛かる場合、それが完成しないと読み込
む部分が作れないでしょ
あ、ファイル作れないから……
そう。まぁ作れなくもないけど、テキストファイルなら簡単に作れるし、
テスト用のファイルをテキストを変えるだけで作れるから
なるほど、バイナリーだとファイルに書き込む機能を先に作らなきゃいけ
ないし、テストデータを作るにもその書き込む機能を使わなきゃいけない
そういうデメリットが特にないならバイナリーでもいいかな。メリットも
あるし
たとえば?
たとえば、今、 double を書き込んだけど、これを文字列として書き込む
場合
んー、 fprintf() とか使えばいいんじゃない?
精度の問題があるでしょ、誤差とか
あ”…… 1.1 とか困るね……
 double は誤差が出るし、 fprintf() で出力するにしても、精度、つま
り出力する桁数を気にしなきゃいけないから
長くするとデータ大きくなるね
でも桁数を減らすと、書き込んでから読み込む、と値が違うって可能性が
あるわけ
それは嫌……
そういうことを考えると、バイナリーの方が簡単でしょ
……質問!
はい、火美ちゃん
テキストとバイナリーって混ぜられないの?
混ぜようと思えば混ぜられるけど……テキストだって、バイナリーの一種
だから
あ、そーか、文字列って見なせるものがテキストでそれ以外はバイナリー
なんだもんね
 fwrite() でテキストを書き込む場合は、こんな感じ

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

    // 文字列を書き込みます。
    const char *const DATA = "ABCDE";
    fwrite( DATA, sizeof( char ), strlen( DATA ), pstFile );

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

テキストでも fwrite() で書き込めるんだね
使い方もこれまでと同じ
あ、でも第3引数が 1 じゃないね。そか、第2引数が char のサイズだ
から、その代わりに第2引数に文字数入れてるんだね
そういうこと。結局は、第2引数と第3引数を掛けたものが、書き込む
データのサイズになればいいんだけど
だったらそう第2引数に書いてもいいんじゃないの?
そうかもね。その辺は好みでいいかも
好み……
 fwrite() は、第1引数のアドレスから、第2引数 * 第3引数バイトま
でをそのままファイルに書き込む、それだけだから


/*
    Preview Next Story!
*/
やっぱ結局は、ひとつひとつって感じね
プログラムはその積み重ねだからね
ううん、そうじゃなくてファイルの書き込み
あー、それは大丈夫。構造体使えばいいから
構造体?
そう、次はその話
というわけで次回
< Version 12.11 パディングとアライメント >
につづく!
ってタイトル構造体と関係ないじゃん!
でも実は関係してたり
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。