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