トップ回答者
バイナリファイルをテキスト化するプログラム

質問
-
書籍をもとにバイナリファイルをテキスト化するプログラムを作ったのですが、
unsigned int count;
ifs.read((char *)&count, sizeof(count));この2行の部分の説明が、
「最初の4バイトを読み取ってデータの個数を変数countに入れます。」
となっています。この最初の4バイトというのはバイナリファイルの最初のデータの16進数の4CD(10進数 1229)を示すのだと思いますが、このプログラムのどの部分で「最初の4バイト」を読み取っているのかがわからず、教えて頂きたいです。
何卒宜しくお願い致します。
回答
-
ifsというオブジェクトののreadメソッドを呼び出しているので、このifsというオブジェクトの型次第ではありますが、ifstreamであると仮定して。
ファイル読込は基本的にストリームという概念で扱います。ストリームは、内部で「現在の位置」を保持しています。読み取り用に開いた場合、普通はファイル先頭が「現在の位置」の初期値になります。
で、ifstream::readメソッドは第1引数に読み込んだデータを格納するバッファを、第2引数に読み込むデータサイズを指定します。sizeof(unsigned int)は、今のWindowsだと常に4になりますので、「現在の位置から4バイト読み込め」という意味になります。
上述の通り、ファイルを開いた直後の現在の位置はファイル先頭なので、「最初の4バイトを読み込む」という処理になります。
ちなみに、このreadによって4バイト読み込むと、現在の位置は自動的に4バイト進みます。なので、続けて再びifs.read((char *)&count, sizeof(count))とやると、先頭4バイト目から4バイト読み取ることになります。
- 回答としてマーク ディッセンバー 2017年4月28日 8:36
すべての返信
-
ifsというオブジェクトののreadメソッドを呼び出しているので、このifsというオブジェクトの型次第ではありますが、ifstreamであると仮定して。
ファイル読込は基本的にストリームという概念で扱います。ストリームは、内部で「現在の位置」を保持しています。読み取り用に開いた場合、普通はファイル先頭が「現在の位置」の初期値になります。
で、ifstream::readメソッドは第1引数に読み込んだデータを格納するバッファを、第2引数に読み込むデータサイズを指定します。sizeof(unsigned int)は、今のWindowsだと常に4になりますので、「現在の位置から4バイト読み込め」という意味になります。
上述の通り、ファイルを開いた直後の現在の位置はファイル先頭なので、「最初の4バイトを読み込む」という処理になります。
ちなみに、このreadによって4バイト読み込むと、現在の位置は自動的に4バイト進みます。なので、続けて再びifs.read((char *)&count, sizeof(count))とやると、先頭4バイト目から4バイト読み取ることになります。
- 回答としてマーク ディッセンバー 2017年4月28日 8:36