Как убрать разницу в локали между интерфейсами gui и командной строки одной и той же программы? - PullRequest
1 голос
/ 31 января 2010

Программа сохраняет файл настроек в виде текста, который содержит числа с плавающей запятой типа long double. Файл настроек может быть сохранен только через графический интерфейс (GTK2), а файлы также могут быть загружены через командную строку и без вызова графического интерфейса.

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

Я уже задавал следующий вопрос: MPFR, printf, десятичные разряды, локали, проблема ввода-вывода файла , в которой предлагалось использовать setlocale(LC_ALL, "C"), который я поместил в начале main. Поскольку это не сработало, я поместил его после вызова gtk_init_check, но опять же, это не имело никакого значения. ( РЕДАКТИРОВАТЬ Это изменило ситуацию после того, как я установил несколько локалей.)

Я хочу, чтобы программа всегда использовала один и тот же параметр языкового стандарта (или нелокализованный параметр языкового стандарта - «C») для сохраняемых файлов данных, но при этом не хочу портить графический интерфейс.

Как?

Ответы [ 3 ]

1 голос
/ 31 января 2010

вообще не используйте функции, чувствительные к локали, для сохранения и восстановления значений. Например, используйте ieee754.h для сохранения и загрузки мантиссы и экспоненты.

0 голосов
/ 31 января 2010

Сохраните используемый язык в верхней части кода загрузки / сохранения:

char* loc = setlocale(LC_NUMERIC, NULL);

Затем для каждого экземпляра, в котором вы записываете числовые значения в вызове файла:

setlocale(LC_NUMERIC, "C");
/* code here for read/write of numeric values:
fprintf(fd, "aspect %0.20lf\n", img->aspect);
*/
setlocale(LC_NUMERIC, loc);

Должен сделать свое дело.

0 голосов
/ 31 января 2010

Если вы можете жить только с сохранением этих значений как double, я бы просто предложил использовать функции форматирования / разбора строк в glib с ограничением ASCII:

Чтобы преобразовать значение в строку, вызовите <a href="http://library.gnome.org/devel/glib/stable/glib-String-Utility-Functions.html#g-ascii-dtostr" rel="nofollow noreferrer">g_ascii_dtostr()</a>. Чтобы пойти другим путем, используйте <a href="http://library.gnome.org/devel/glib/stable/glib-String-Utility-Functions.html#g-ascii-strtod" rel="nofollow noreferrer">g_ascii_strtod()</a>.

Я понимаю, что это может быть плохо, поскольку вы снижаете точность, переходя от long double к обычному старому (g)double, конечно. Кажется, что glib не поддерживает тип long double, вы уверены, что он действительно дает вам больше точности?

...