MPFR, printf, десятичные разряды, локали, проблема файлового ввода-вывода

Пользователь моей программы сообщил о проблемах с чтением файла настроек, написанного моей программой. Я посмотрел на рассматриваемый файл настроек, и вместо десятичных точек с точкой «.» он использует запятые «,».

Я предполагаю, что это связано с локалями?

Файловый ввод-вывод использует fprintf и mpfr_out_str для вывода файла и getline в сочетании с atol, atof, mpfr_set_str и т. д. для ввода файла.

Что мне здесь делать? Должен ли я заставить свою программу всегда использовать точки, даже если языковой стандарт машины хочет использовать запятые? Если да, то с чего начать?

Редактировать: я только что заметил, что эта проблема возникает при указании файла настроек для использования в командной строке вместо его загрузки через графический интерфейс - указывает ли это на проблему на компьютере OP или в моем коде?


person James Morris    schedule 30.01.2010    source источник
comment
У меня такое ощущение, что mpfr не отвечает за локализацию распечатки с плавающей запятой...   -  person Stefano Borini    schedule 30.01.2010
comment
Да, я тоже чувствую это, поскольку все выходные значения с плавающей запятой, независимо от того, использовались ли подпрограммы mpfr или printf, одинаковы.   -  person James Morris    schedule 30.01.2010
comment
что произойдет, если вы запустите программу после экспорта LC_ALL=C?   -  person Stefano Borini    schedule 30.01.2010
comment
Я не могу проверить это лично, так как проблема возникает на компьютере пользователя.   -  person James Morris    schedule 30.01.2010


Ответы (1)


Вы вообще звоните setlocale? Если нет, я бы посоветовал либо встроить локаль, используемую для создания файла, в файл настроек или заставить все операции ввода-вывода файлов настроек использовать локаль C, как было сделано в предыдущем предложении setlocale(LC_ALL, "C").

Еще один вариант — использовать функции форматирования для конкретной локали (с суффиксом _l в MSVC) и явно создавать локаль C через _create_locale(LC_ALL, "C").

person MSN    schedule 30.01.2010
comment
Ах, извините, забыл упомянуть Linux. Тем не менее, setlocale - это C89... Является ли форсирование локали C приемлемым поведением приложения? - person James Morris; 31.01.2010
comment
Я мог применить локаль C только к числовому форматированию, например setlocale(LC_NUMERIC, "C"). - person James Morris; 31.01.2010
comment
Я наконец принял этот ответ, но не без дальнейшего расследования. См. также: stackoverflow.com/questions/2171527/ - person James Morris; 02.02.2010
comment
Да, в идеале вы должны были бы сохранить эти данные без использования форматирования, специфичного для локали (т. Е. Не текста), но это, вероятно, совершенно другой вопрос. - person MSN; 02.02.2010