odczyt << a << b;
1) oprócz zapisu i przesunięcia pozycji zapisu o odpowiednią ilość bajtów również przesuwa pozycję do odczytu, zgaduje że nie o to ci chodziło.
2) nigdzie nie używasz jakiegoś separatora między a i b. zakładając że
odczyt << a << b;
zostawi ci pozycję do odczytu w poprzednim miejscu (lub ją samemu przestawisz na dobrą pozycje) to skąd
odczyt >> a >> b;
ma wiedzieć jak ma sparsować "1020" do a i b ? Jak nie użyjesz separatora to 1020 sparsuje do a i coś co jest dalej po tym do b czyli prawdopodobnie jakieś smieci, inne dane lub dostaniesz eof.