Запись двоичных файлов с помощью C++: локаль по умолчанию имеет значение?

Попытайтесь использовать

<ComboBox ItemsSource="{Binding Source={StaticResource ExampleEnumValues}}"
    SelectedValue="{Binding Path=ExampleProperty}" />
8
задан TheScottMachine 3 December 2009 в 02:30
поделиться

3 ответа

В Windows все должно быть нормально, но в других ОС следует также проверять окончания строк (в целях безопасности). Языковой стандарт C / C ++ по умолчанию - «C», который не зависит от языкового стандарта системы.

Это не гарантия. Как вы знаете, компиляторы C / C ++ и их целевые машины сильно различаются. Так что вы ждете неприятностей, если будете придерживаться всех этих предположений. Накладные расходы на изменение локали незначительны, если вы не попытаетесь сделать это сотни раз в секунду.

0
ответ дан 6 December 2019 в 01:40
поделиться

Если у вас установлен двоичный флаг, все, что вы пишете, будет записано в файл дословно. Никаких преобразований. Как вы интерпретируете байты, зависит от вас (и, возможно, от языкового стандарта).

Еще одна вещь: существует вероятность поломки на разных языках. Если, например, ваш источник данных создал двоичные данные на основе локали (и формат этих данных будет меняться в зависимости от локали - кстати, это плохая идея). Это вызовет проблемы при загрузке данных на машины с другой локалью. Однако это ошибка дизайна.

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

1
ответ дан 6 December 2019 в 01:40
поделиться

Thanks for the help. I just thought it might be helpful to post some additional information about this that wouldn't fit in a comment.

The default locale for C++ programs is always the "C" locale (http://www.cplusplus.com/reference/clibrary/clocale/setlocale/). If this is the only locale used in your program, it means the behaviour doesn't depend on the particular locale configuration of the machine that it's running on. It also means that unformatted I/O for a char does not undergo any code conversion (wchar_t might be a different story though). This means that (given the assumptions in the question) read and write should allow binary data to be recovered unmodified.

(from reading the documentation) You can globally set the application's locale to match the system default by calling setlocale(LC_ALL,""), which will mean streams constructed from that point will use the system default locale. To set it back to the "C" locale you can call setlocale(LC_ALL, "C"), which will mean this is what streams constructed in the future will use. You can also specify that the "C" local should be used for a stream that's already constructed by calling stream.imbue(locale::classic()).

1
ответ дан 6 December 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: