В настоящее время я работаю над программой, которая должна читать и записывать простые двоичные файлы.Данные, содержащиеся в этих файлах, достаточно велики, чтобы сделать даже сжатые текстовые файлы непрактичными.Однако в этих двоичных файлах мне нужно хранить некоторые метаданные в виде текста.Я могу легко создать один или несколько std::string
s в своем коде ввода-вывода, которые затем могут быть сохранены, но моя простейшая идея для их хранения выглядит примерно так:
std::string toStore; //assume that this string is decently long and has only ascii characters in it
std::vector<unsigned char> output;
unsigned char *strPointer = reinterpret_cast<unsigned char*>(toStore.data());
output.insert(strPointer, strPointer+toStore.length());
output.push_back('\0');
std::ofstream fout;
fout.write(output.data(), output.size());
Этот метод, однако, имеет серьезнуюпроблема: поскольку кодировка символов в разных реализациях C ++ не гарантируется одинаковая, формат файла будет другим, когда он читается или записывается в разных реализациях C ++.
Меня интересует моя программа, поддерживающая Linux, Mac OS и Windows, просто перекомпилированная (т.е. без изменений кода).Эти строки содержат только символы ASCII.Таким образом, моя другая идея состоит в том, чтобы определить мою собственную кодировку символов и использовать операторы switch (или что-то подобное) для преобразования между ними и любой другой кодировкой реализации.Это практично, потому что ASCII не содержит много символов.Однако такая новая кодировка не идеальна, потому что она затруднит чтение моих файлов для других программистов, желающих реализовать мой формат (что вполне вероятно в контексте того, что представляет собой эта программа).Я мог бы попытаться использовать вышеупомянутую технику с ASCII в качестве кодировки символов, но это неоправданно неэффективно, потому что большинство компиляторов все равно будут использовать ASCII.
Есть ли какой-нибудь лучший способ справиться с этим?Например, есть ли стандартная библиотечная функция для преобразования строки в репрезентацию ASCII или Unicode?