У меня есть код, который манипулирует двоичными файлами, используя fstream с установленным двоичным флагом и используя неформатированные функции ввода-вывода для чтения и записи. Это работает правильно на всех системах, которые я когда-либо использовал (биты в файле точно такие же, как и ожидалось), но в основном это все английские США. Мне было интересно, что эти байты могут быть изменены с помощью codecvt в другой системе.
Похоже, стандарт говорит, что использование неформатированного ввода-вывода ведет себя так же, как ввод символов в потоковый буфер с помощью sputc / sgetc. Это приведет к вызову функций переполнения или потери в потоке, и это звучит так, как будто это приводит к тому, что материал проходит через некоторый код (например, см. 27.8.1.4.3 в стандарте c ++). Для basic_filebuf создание этого codecvt определено в 27.8.1.1.5. Это выглядит так, как будто результаты будут зависеть от того, что возвращает basic_filebuf.getloc ().
Итак, мой вопрос, могу ли я предположить, что массив символов, записанный с использованием ofstream.write в одной системе, может быть дословно восстановлен с помощью ifstream.read в другой системе, независимо от того, какую конфигурацию локали любой человек может использовать в своей системе ? Я бы сделал следующие предположения:
- Программа использует по умолчанию
локаль (то есть программа не
изменение настроек локали
на все).
- Обе системы имеют CHAR_BIT 8, имеют одинаковый битовый порядок в каждом байте, сохраняют файлы в виде октетов и т. Д.
- У объектов потока установлен двоичный флаг.
- Нам не нужно беспокоиться о каких-либо различиях в порядке байтов на этом этапе. Если какие-либо байты в массиве следует интерпретировать как многобайтовое значение, преобразования с порядком байтов будут обрабатываться в соответствии с требованиями на более позднем этапе.
Если языковой стандарт по умолчанию не гарантирует прохождения через все это без изменений в какой-либо конфигурации системы (я не знаю, арабский или что-то в этом роде), то каков наилучший способ записи бинарных файлов с использованием C ++?