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

    質問

  • 書籍をもとにバイナリファイルをテキスト化するプログラムを作ったのですが、

      unsigned int count;
      ifs.read((char *)&count, sizeof(count));

    この2行の部分の説明が、

    「最初の4バイトを読み取ってデータの個数を変数countに入れます。」

    となっています。この最初の4バイトというのはバイナリファイルの最初のデータの16進数の4CD(10進数 1229)を示すのだと思いますが、このプログラムのどの部分で「最初の4バイト」を読み取っているのかがわからず、教えて頂きたいです。

    何卒宜しくお願い致します。

    2017年4月28日 7:44

回答

  • 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日 7:58
  • 「ifs」が何か示されていないので、このコードだけでは確かなことは言えません。
    とりあえず、ディッセンバーさんがやってみるべき事は以下かもしれません。

    1.ifsが何のクラスのインスタンスであるかを探す。
    2.そのクラスのread( ・・・ )関数の機能の説明と、引数の意味を探す。

    それが、ここに示せると最初の問いの答えも自からわかってしまうのではないかと予測できます。

    2017年4月28日 7:58

すべての返信

  • 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日 7:58
  • 「ifs」が何か示されていないので、このコードだけでは確かなことは言えません。
    とりあえず、ディッセンバーさんがやってみるべき事は以下かもしれません。

    1.ifsが何のクラスのインスタンスであるかを探す。
    2.そのクラスのread( ・・・ )関数の機能の説明と、引数の意味を探す。

    それが、ここに示せると最初の問いの答えも自からわかってしまうのではないかと予測できます。

    2017年4月28日 7:58
  • 情報たらずで申し訳ございません。

    ifsはifstreamです。

    大変わかりやすい説明ありがとうございます。

    助かりました。

    2017年4月28日 8:45
  • 返信ありがとうございます。

    解決出来ました。

    2017年4月28日 8:47