Listing 2

// Read/write via long char-type; replace encoding errors.
int main()
{
  using namespace std;
  using namespace UTF8Lib;
  typedef UTF8Filestream<long> UTF8LFilestream;
  typedef UTF8Streambuf <long> UTF8LStreambuf;
  UTF8LFilestream fin ("utf8_test.txt",  ios_base::in );
  UTF8LFilestream fout("utf8_test2.txt", ios_base::out);
  for(;;) {
    long ch;
    if(!fin.get(ch)) {
      UTF8LStreambuf::buffer_state_type state;
      state = fin.rdbuf()->get_state();
      if(state == UTF8LStreambuf::RD_EOF) break;  // done...!
      switch(state)
      {
      case UTF8LStreambuf::RD_LEAD_INVAL   : ch = 'L'; break;
      case UTF8LStreambuf::RD_CONT_INVAL   : ch = 'C'; break;
      case UTF8LStreambuf::RD_NONSHORT     : ch = 'N'; break;
      case UTF8LStreambuf::RD_UNICODE_INVAL: ch = 'U'; break;
      case UTF8LStreambuf::RD_OVERFLOW     : ch = 'O'; break;
      default: assert(!"Invalid converter state.");
      }
      fin.clear();
    }
    fout.put(ch);
  }
}