Hola, esto esta sacado del MSDN de VC++ 6
ostream::write
ostream& write( const char* pch, int nCount );
ostream& write( const unsigned char* puch, int nCount );
ostream& write( const signed char* psch, int nCount );
Parameters
pch, puch, psch : A pointer to a character array.
nCount : The number of characters to be written.
Remarks
Inserts a specified number of bytes from a buffer into the stream. If the underlying file was opened in text mode, additional carriage return characters may be inserted. The write function is useful for binary stream output.
Por lo que debe de ser lo que te estoy diciendo. Con el printf le estas indicando el formato de la variable que quieres sacar por pantalla, al decir %d le indicas que es de tipo "int". En cambio el "write" por lo que he entendido al consultar, te escribe el valor sin formato alguno "ostream", es decir, la secuencia de "0" y "1" que toque. Por eso te mete los simbolos raros, porque esos simbolos es como el procesador interpreta el valor de dicha secuencia. Mira el mensaje de arriba.