Вы используете operator<<()
, который выводит форматированный текст в поток. Таким образом, вы записываете открытый текст в двоичный файл, что в некоторой степени противоречит цели записи в двоичном режиме. Попробуйте открыть выходной файл в текстовом редакторе и убедитесь сами.
У вас есть два варианта: либо писать в текстовом режиме, и разделять значения пробелами (поскольку запись в двоичном режиме вводит в заблуждение при использовании форматированного вывода), либо использовать метод потока write()
с приведением.
f.write(reinterpret_cast<char*>(&k), sizeof(int));
// ...
f.read(reinterpret_cast<char*>(&k), sizeof(int));
Я лично предпочитаю писать в текстовом режиме. Это означает наличие более чистого кода и переносимого выходного файла. Если вам нужно, вы можете сжать файл.