LINUX.ORG.RU

sscanf

 , ,


0

1

Тут давеча sscanf умным стал - в разных локалях для %f разные сепараторы использует. А мне им надо читать стандартный (не зависящий от локали) формат в приложении, которое вообще локали поддерживает. Так что LC_NUMERIC трогать нельзя. Так вот, нет ли какой-нибудь locale-agnostic версии функций *scanf, можно в виде отдельных исходников, дабы прикладывать к своим и собирать вместо системной?

★★★★★

В исходниках ядра смотрели (linux/lib/vsprintf.c)? Возможно эта реализация вас устроит.

Dead ★★★★
()
Ответ на: комментарий от Dead

Оно к сожалению не умеет floating point :(

slapin ★★★★★
() автор топика

Так что LC_NUMERIC трогать нельзя.

перед вызовом sscanf выставляй нужную, потом - обратно, не?

lazyklimm ★★★★★
()

считать как строку, заменить локалезовисимую шнягу на статическую запятую\точку, распарсить любой переводящей шнягой.

inn
()
Ответ на: комментарий от inn

Дык в том то и дело что наоборот, читается то всегда одно и то же, а вот sscanf интерпретирует это в зависимости от локали, и я даже не знаю, какой набор разделителей во всех локалях чтобы заменять. да и гадко это как-то, некрасиво :(

slapin ★★★★★
() автор топика
Последнее исправление: slapin (всего исправлений: 1)
Ответ на: комментарий от slapin

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

Dead ★★★★
()
Ответ на: комментарий от lazyklimm

ну я делаю setlocale(LC_NUMERIC, «C»), а потом setlocale(LC_NUMERIC, "") но это же неправильно! Должен быть какой-то другой способ...

slapin ★★★★★
() автор топика

Можно попробовать взять scanf из glibc или из другой libc и адаптировать под свои нужды.

Sorcerer ★★★★★
()
Ответ на: комментарий от slapin

Это — единственный правильный способ, пока кто-нибудь нормальный не пропатчит идиотскую русскую локаль. Я уж не знаю, что за дебил там сделал запятую десятичным разделителем, но этот баг уже лет 20 висит. И всем похрен!

Anon
()
Ответ на: комментарий от Anon

Еще неделю назад все работало :(

slapin ★★★★★
() автор топика
Ответ на: комментарий от PolarFox

Да знаю. Наследие бескультурия, блин! А гомериканцы любят пробел тыкать в качестве разделителей групп циферек по 3. Искоренять это надо. И систему СИ внедрять. Задолбали уже со своими фаренгейтами и дюймами.

Anon
()

в виде отдельных исходников, дабы прикладывать к своим и собирать вместо системной

http://daniel.haxx.se/projects/trio/competition.html
http://www.and.org/vstr/comparison

ну я делаю setlocale(LC_NUMERIC, «C»), а потом setlocale(LC_NUMERIC, "") но это же неправильно!

Я бы так и делал. Не знаю, правда, есть ли проблемы с потоками.

gv
()

Переходи к бсдшникам, у них есть печеньки^W sscanf_l ;)

const86 ★★★★★
()

Попробуйте использовать uselocale() - функция может установить локаль только для текущего потока. Функция в стандарте posix с 2008 года. В линуксовых манах я её не нашел, но в locale.h она сидит, как и положено.

Sorcerer ★★★★★
()
Последнее исправление: Sorcerer (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.