#pragma twice

KAB-studio > プログラミング > #pragma twice > 236 Version 12.13 バイナリーのまとめ

#pragma twice 236 Version 12.13 バイナリーのまとめ

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

 Version 12.13
バイナリーのまとめ

さて、バイナリー編は今回が最終回です
恒例のまとめね〜
まず、一番重要なのは、テキストもバイナリーも元々は同じメモリ上の
データってこと。メモリ上のデータで、文字としてみなせるものがテキスト
データ、それ以外がバイナリーデータに当たります
1バイトずつ区切って、それが文字になればテキストってわけね
基本的にはね。日本語が関係してくるとややこしくなるけど
そっか、1バイトずつ区切っても、2個ずつ見なきゃわかんないね
そう、だから、1バイトずらして見たりすると
リードバイトとトレイルバイトが逆になる……日本語の文字にならない

とたんにバイナリーになっちゃう。ただ、バイナリーって言っても、た
いがいはなんらかのデータになるはず
なんらかのデータ?
4バイトで区切ったら int になる、みたいに
そか、テキスト以外がバイナリーって言っても、なんかのデータっていう
のは同じなんだもんね
さっきのリードバイトとトレイルバイトがずれた例を考えると、これは
データとして取り出せない、だからバイナリーデータですらない、とも言え
るかな
じゃあなんなの?
うーん……だから、むしろテキストかバイナリーかっていうのは〈見方〉
の問題かも
ファイル開くときのあのオプションの話?
そういうことだね。テキストとして見るか、バイナリーとして見るか
いまいちよくわかんない
僕もよくわからない
ダメじゃん
定義自体曖昧だからね
んっと、次に整数と実数について教わったんだよね
そう、 double の中身
複雑だったような簡単だったような。仕組みは簡単なんだけど、メモリを
直接見てもわからないから……
ビット単位で見ないと難しいね。そのために関数も作ったし
でも、仕組みってゆーか、誤差が出る理由さえわかっちゃったら、もう気
にしなくていいんでしょ?
うん、理解しておいてもらえばいいかな。 double は int と違って、
ビットやバイトを見て計算する必要はないし
次は、ファイルアクセスの時のテキストモードとバイナリーモードね
これはさっきの、 VC で開くときのテキストモードとバイナリーモードと
は違う意味だから注意してね
え、そうなの?
 VC の方も、テキストは改行コードを変える、っていうのはもちろんして
るんだけど、それに加えて表示方法も違うってこと
そか、テキストだと文字列で、バイナリーだと16進で、っていう違い

だからたとえば、テキストファイルをバイナリーモードで開いて、それを
文字列として出力、っていうこともできるよ
でもそれだと改行コード変わらないじゃん
元々 \n しか入っていないテキストファイルだったら?
なんか引っかけ問題っぽい……
そうじゃなくて、OSによってはテキストファイルの改行が \n だけって
いうのもあるってこと
あ、なるほど。インターネットとかで、他のOSのテキストファイルをも
らった時の話ね
実際、改行コードや文字コードの関係で、多くのエディタはテキストファ
イルをバイナリーモードで開いて、適切な変換を行ってから表示するように
なってるはず
違う文字コードだったら、まさにバイナリーファイルなんだもんね
だから、この fopen() のテキストモードとバイナリーモードは、単に改
行コードの変換をするだけ、って憶えておいた方がいいかな
変換機能だけ、と
だから、そういう意味では fread() や fwrite() で読み書きするのと、
テキストモードかバイナリーモードか、っていうのは本当は別の話
でも、 fread() や fwrite() を使う時はバイナリーモードにするんで
しょ?
それはそう。バイナリーのデータに改行コードと同じものが入っていたら
変換されちゃうからね。でも
テキストモードでも fread() や fwrite() は使える、と
そういうこと。こういった、テキストだからこう、バイナリーだからこ
う、っていう形で分けられないっていうのが、バイナリーの難しいところか

TPOでどういう意味か考えなきゃいけないってわけね
 fread() や fwrite() の回では、複数のバイナリーデータの読み書きも
してみました
でもさ、構造体の方もそうだけど、結局バイナリーデータで読み書きする
な、って感じよね
最近の流れがそうなってきてるからね。
その〈流れ〉って、具体的にはなんなの?
 XML って知ってる?
聞いたことはあるけど。ホームページの HTML みたいなのって
そう。たとえば、 Version 12.11 ( No.234 ) の TEST_STRUCT_DOUBLE_2 
を XML で表すと、こんな感じ

<?xml version="1.0" encoding="UTF-8" ?>
<datas>
    <member name="m_ch">63</member>
    <member name="m_d">2.0</member>
    <member name="m_ch2">63</member>
</datas>

へー、 name で変数名指定できるんだ
あ、ううん、それは僕が今決めただけ。何かの仕様とかで決まってるわけ
じゃないから
へ?
 XML は、そういうのを全部自分で決められるんです。そういう意味で、
すごく柔軟にデータを格納できるんです。それにテキストファイルだから
普通にエディタで作れる、と
そういうこと。それに、今火美ちゃんが言ったような感じに、実は〈型〉
も仕様で決めることができるんです
どういうこと?
たとえば

    <member name="m_d">AAA</member>

ってするとエラーにすることができる、ってこと
それってメリットある?
自分でエディタで打ち込むと、ミスが多いからね
あ! コンパイルするみたいな感じなんだ
そういうこと。そういうチェックができるのはメリットだけど、その分、
きっちり決まりすぎて融通が利かなくなることもあるかな。まぁそういう
話になってくると難しくなってくるけど
……ってゆーか、なんでその XML の使い方って教えてくれないの?
 VC だと標準の機能だけじゃ使えないんだよね
え? ファイル読み込めばいいんじゃないの?
さっきのあのファイルの構造、解析するプログラムって作れる?
難しそう……
だから、普通は専用のクラスとか使います。 DOM とか SAX とかっていう
から、興味があったら調べてみて
あとでぐぐってみる
そういったクラスを使うためには、ライブラリをダウンロードして組み込
んだりしなきゃいけないから、少し上級の話になっちゃうんで
あとまわし、ね
そういうこと。実際、 XML だけで1章は割かないと
そんなに奥が深い?
深いし、憶えることも多いし
それは難しそう……
難しいのに加えて、最近できたものってこともあって、あまり広まっては
いないかな。それよりは、 CSV の方が一般的だね
しーえすぶい? それもよく聞くけど
 Comma Separated Values 、つまりカンマ( , )で区切ったファイル形
式のこと。 TEST_STRUCT_DOUBLE_2 を CSV にするとこんな感じかな

63,2.0,63

普通に , を挟んで並べてるだけね
 CSV はランタイムとかを使ってアクセスするのが簡単だから、こっちの
方が広まってるかな
でもカンマで分けるのってどうするの?
ひとつは、1文字ずつ拾っていって , が出てくるまでをひとつのデータ
とみなす、っていう方法
それ面倒そう……
それに、 CSV データの中に文字列を入れるときには注意が必要とか
たとえば?
文字列の中にカンマが入らないか
あ……
カンマが入る可能性があったら、カンマを他の文字に置き換えるとかしな
いといけないから面倒
書き込むときの話?
そういうこと。読み込む時の話で言うと、 Excel で CSV ファイルとして
出力すると、文字列が "" で囲まれて入ってるから、その中の , は無視す
る、っていう処理が必要になったりも
げげ
実際、 CSV ファイルはいろんな場面で使われているから、文字コードの
関係も含めて、実際に処理するのは結構難しいかも
……質問!
はい火美ちゃん
難しいのに、なんで一般的なの?
うーん……他に方法がないから、かな
ない?
データをまとめて格納する形式で、テキスト形式で、わかりやすい、って
いう条件を満たす物が CSV くらいしかなかった、とかかな
……もうひとつ質問!
はい火美ちゃん
 , の話って、 XML にも当てはまるんじゃないの? < とか > が中に
入ってた時はどうするの?
それは、 XML 用のライブラリが自動的に変換してくれます

 XML 用ライブラリは、かなり機能的に充実してるし、ドキュメントも多
いから、使い勝手はいいよ。仕様も決まってるし
……逆に言うと、 CSV は歴史があるくせにちゃんとしたライブラリがな
いし、使い勝手も悪い、と
そういうことになるね。ただ、文化的なものもあるかも
文化?
 XML は Java っていうプログラミング言語が一番のメインになってて、 
Java は元々フリーのライブラリがいっぱい作られてるから
だから XML のライブラリも充実してる、と
 CSV は昔の C 言語や C++ 言語が中心で、この言語は Java みたいにラ
イブラリが充実してないから
自分で作らなきゃいけない……
 C++ はそういうの多いかな
めんどくさ……あ、もうひとつ質問!
はい、火美ちゃん
取ってきたデータを int や double にするのはどうすればいいの?
それは Version 12.02 ( No.225 ) でやったでしょ
そっか、ランタイムとか使えば文字列から変換できるんだね
そういうこと
そうなると、やっぱバイナリーよりテキスト、ってなるんだね
取り扱いが楽とか、ファイルを直接見られて編集できるとか、メリットが
かなりあるからね。今回はバイナリーの扱いについて見てみたけど、それは
推奨するためというよりは
あんま使うな?
ってことになるかな。使う時にはデメリットも考えて、ってところ

/*
    Preview Next Story!
*/
バイナリー編終わり〜、で、次は?
次回はアルゴリズム
よく聞くけどそれって何?
うーん、明確な定義ってないかも
なにそれ
次回はそこから説明します
というわけで次回
< Version 13.01 アルゴリズム? >
に続く!
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。