Where to begin...
Firstly, your entire OutputString generation can be shortened to two lines:
memset(score.OutputString, 0, sizeof(char)*10);_snprintf(score.OutputString,9,"%09d",score.Score);
Looking at the output file in a hex editor, I see that it's outputting the number 10 as 0x0D0A0000, which is what's giving you the funky value. I have no idea why. I blame ofstream.
I also note that if I run the app twice, it's just going to append to the end of the score file, instead of overwriting it.
For the sake of it, I converted the code to use C file IO routines, and it works perfectly.
struct HighScore{ int Rank; int Score; char OutputString[10];};void WriteHighScoreToFile(HighScore &score, FILE *pFile){ memset(score.OutputString, 0, sizeof(char)*10); _snprintf(score.OutputString,9,"%09d",score.Score); fwrite(&score, sizeof(HighScore), 1, pFile);}int _tmain(int argc, _TCHAR* argv[]){ FILE *pFile = fopen("binoutput.dat","wb"); HighScore myScores[10]; for (int i=0; i<10; i++) { myScores.Rank = i+1; myScores.Score = 0; WriteHighScoreToFile(myScores, pFile); } fclose(pFile); HighScore myScores2[10]; pFile = fopen("binoutput.dat","rb"); for (int i=0; i<10; i++) { fread(&myScores2,sizeof(HighScore),1,pFile); cout << "MyScore[" << i+1 << "]" << endl; cout << myScores2.Rank << endl; cout << myScores2.Score << endl; puts(myScores2.OutputString); cout << "\n\n"; } fclose(pFile); printf("\r\nPress [Enter] to exit...\r\n"); getchar(); return 0;}