C++でバイナリデータ内の「0x1a」を正しく読むには?

解決


free  2002-06-18 15:27:30  No: 50238  IP: [192.*.*.*]

VC++でバイナリデータを読み書きしたいのですが、
入力ストリームをinputFileとして、
while(!inputFile.eof())で回して
(inputFile).readを使ってデータを読み込もうとすると、
データ内にEOFを同じ値の0x1aがあるとそこで読み込みが
止まってしまいます。うまくデータを読み込む方法はないでしょうか。

テスト用に以下のようなプログラムを書いてみました。
---------------------
#include <iostream>
#include <fstream>
using namespace std;

void writeFile(){
  ofstream outputFile("test.dat", ios::out);
  int count = 0;
  for(int i = 0; i < 0xffff; i++){
    //if((i % 256) != 26 && ((i >> 8) % 256) != 26){
      outputFile.write((char *)&i, sizeof(int));
      count++;
    //}
  }
  cout << "Write : " << (count * 4) << "byte." << endl;
  outputFile.close();
}

void readFile(){
  ifstream inputFile("test.dat", ios::in);

  int count = 0;
  int i;
  while(!inputFile.eof()){
    inputFile.read((char *)&i, sizeof(int));
    count++;  
  }
  inputFile.close();

  cout << "Read  : " << (count * 4) << "byte. " << endl;
}

main(){
  writeFile();
  readFile();
}

コメントの部分を外して、EOFの値を含むデータを書き込まないようにすると、
きちんと最後までファイルを読みますが、EOFの値が途中で混じっていると
そこで止まってしまうようです。

どなたかご指導のほどよろしくお願いします。

編集 削除
YuO  2002-06-18 15:49:15  No: 50239  IP: [192.*.*.*]

> ifstream inputFile("test.dat", ios::in);
std::ifstream inputFile("test.dat", std::ios::in | std::ios::binary);
にしてみたらどうでしょう。

編集 削除
free  2002-06-19 11:34:28  No: 50240  IP: [192.*.*.*]

早速の回答ありがとうございます。
問題なく解決しました。

ちょっと本に載っていること以外の知識が必要になると
すぐつまづいてしまいます…。

編集 削除