Написать набор целых чисел в std :: ofstream и иметь возможность прочитать их обратно - PullRequest
3 голосов
/ 19 марта 2010

Мне нужно написать группу целых чисел без знака в std::ofstream в двоичном режиме:

std::ofstream f;
f.open("some path", std::ios::out | std::ios::binary);
// some loop
{
  unsigned int k = get_k(); // may product numbers from 0 to 65535
  f << k;
}
f.close();

Они записываются в выходной файл "как есть" без любого разделителя. Поэтому, когда я пытаюсь прочитать их обратно (ожидая получить то, что написал), используя std::ifstream, я получаю очень странные значения. Что я делаю не так?

Или я должен поставить ' ' (пробел) в поток после любого добавленного числа, чтобы разделить их?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 19 марта 2010

Вы используете operator<<(), который выводит форматированный текст в поток. Таким образом, вы записываете открытый текст в двоичный файл, что в некоторой степени противоречит цели записи в двоичном режиме. Попробуйте открыть выходной файл в текстовом редакторе и убедитесь сами.

У вас есть два варианта: либо писать в текстовом режиме, и разделять значения пробелами (поскольку запись в двоичном режиме вводит в заблуждение при использовании форматированного вывода), либо использовать метод потока write() с приведением.

f.write(reinterpret_cast<char*>(&k), sizeof(int));
// ...
f.read(reinterpret_cast<char*>(&k), sizeof(int));

Я лично предпочитаю писать в текстовом режиме. Это означает наличие более чистого кода и переносимого выходного файла. Если вам нужно, вы можете сжать файл.

3 голосов
/ 19 марта 2010

operator<< выводит форматированный текст в качестве вывода, так что да, вам нужно поместить какой-то пробел между числами, чтобы разделить их. В противном случае все они будут объединяться в одну огромную строку цифр, и когда вы будете читать их обратно, она будет продолжать читать цифры как часть числа, пока не переполнится, например если бы вы написали 1 три раза, это выглядело бы как 111.

...