istreambuf_iterator

キーを上手く割出すことができて早速解読!と思ったらどうもおかしい。
1.1.1の解答編にあるxorer.cをC++で書き直してみたけど途中からおかしくなる。
調べてみたらistream_iteratorが空白を無視することが原因だった。
こういうときはistreambuf_iteratorを使えばいいのか。勉強になった。
(Effective STL―STLを効果的に使いこなす50の鉄則 第29項)

#include 
#include 
#include 
#include 

using namespace std;

struct do_xor{
    do_xor(const char *key) :key_(key), pos_(key) {}

    char operator()(const char in){
      if(!*pos_) pos_ = key_;
      return in ^ *(pos_++);
    }
  private:
    const char *pos_;
    const char *key_;
};

int main(int argc, char *argv[]){
  if(argc != 4){
    cerr << "Usage: xorer   " << endl;
    return 1;
  }
  const char *key = argv[1];

  cout << "key:" << key << endl;
  ifstream fin(argv[2], ios::binary);
  if(fin.fail()) return 1;
  ofstream fout(argv[3], ios::binary | ios::trunc);
  if(fout.fail()) return 1;

  transform(istreambuf_iterator(fin), istreambuf_iterator(),
            ostream_iterator(fout), do_xor(key));

  return 0;
}

次の「1.1.3 文通する有名人」はetaoin shrdluだろうな。これは違う言語でやってみよう。