Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

setlocale

61K
17 апреля 2011 года
TauRN7
24 / / 30.12.2010
задача в том что нужно работать с кириллицей: как считывание введённые символов, так и вывод их.
с выводом понятно setlocale(LC_ALL, "Russian");
ну и с вводам вроде тоже setlocale(LC_ALL, ".OCP");
но блин в первом случае проблема с считыванием, во втором с выводом! :mad:

почитал энное количество страниц, и как я понял это всё есчо актуальная проблема, и спобос решения тот что мозг понял единственный через CharToOem

 
Код:
char str1[120];
char str2[120];
gets(str1);
CharToOem((LPCWSTR)str1, str2);
printf("%s", str);


и тут пару вопросов насчёт этой функции:
*для чего тут str2 если преобразования над str1 происходят, она может быть в роли посредника/временного хранилища?
*и второй вопрос - в какой кодировке затем символы будут сохранены в файло? в 886? и если да, то как быть если нужно в ANSI.. или какой там по умолчанию для текстовых файлов для русско-локализованных версий системы)

И вообще если есть какие то альтернативные способы решения, пожалуйста поделитесь.
7
17 апреля 2011 года
@pixo $oft
3.4K / / 20.09.2006
Str2 служит для того,чтобы сохранить данные в Str1(если вдруг вам они нужны в исходном,неконвертированном виде).А сохранены они будут в той кодировке,в которой вы их сохраните.ИМХО,легче было небольшой пример накатать и протестировать,чем тут на форуме спрашивать

P.S.MVC++ 2010–это что?! О_О
316
17 апреля 2011 года
Alm3n
889 / / 29.05.2009
использовал
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
проблема с ними одна - не работает в XP
260
17 апреля 2011 года
Ramon
1.1K / / 16.08.2003
Юзайте Unicode.
61K
17 апреля 2011 года
TauRN7
24 / / 30.12.2010
Цитата: Ramon
Юзайте Unicode.


Ты может объяснишь? Эксперт!
@pixo $oft
Вот и интересно мне как сохранять в нужной кодировке??
MVC++ 2010 это Microsoft Visual C++ 2010, что так сложно догадаться) просто как информация о том в чём я пишу.. Артанис!)
Alm3n
Де пробовал, на выводе бред.

297
17 апреля 2011 года
koodeer
1.2K / / 02.05.2009
За использование функции gets в 21-ом веке нужно отрубать руки. По самые ягодицы.
Юзайте, например, fgets взамен.

TauRN7, вы на чистом Си пишете?
260
17 апреля 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: TauRN7
Ты может объяснишь? Эксперт!



 
Код:
const wchar_t* x = L".";
61K
18 апреля 2011 года
TauRN7
24 / / 30.12.2010
koodeer
Нас, студентату, первых курсов заставляют придерживаться Си, но на деле получается каша из Си и Си++ ну понимаете, время неопределённости и некоторого недопонимания элементарного.
И ради интереса, чем так неугодна gets? и причем тут fgets - если с консоли считывается строка?

Ramon
Если не сложно пояснить запись, то будьте любезны, с первого взгляда не вижу связи с юникодом. И мне казалось wchar_t используюется только для восточных языков(как нам диктовали на лекциях), но ни как не думал что и для кириллицы. Прост примерчик как бы с введённой строкой работать? Темже gets'ом?
wchar_t x[100500];
gets(x);


и что дальше? =/
297
18 апреля 2011 года
koodeer
1.2K / / 02.05.2009
Использование функции gets чревато переполнением буфера. Что произойдёт, если пользователь введёт больше 120 символов? Куда запишутся лишние? К чему это приведёт?
В функции fgets можно задавать максимальное количество вводимых символов.
Ознакомьтесь: http://ru.wikipedia.org/wiki/Gets
61K
18 апреля 2011 года
TauRN7
24 / / 30.12.2010
Терь ясно. Благодарю за инфу.
Правд офтоп немног пошёл.. дабы во избежания закрытия темы за флуд:
Может всё же есть что по теме?
316
18 апреля 2011 года
Alm3n
889 / / 29.05.2009
Код:
int main()
{
    char mess[10]={0};
    FILE* f;
    FILE* f2;

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    f=fopen("out.txt","w+b");
    f2=fopen("in.txt","r");
    scanf("%s",mess);
    fputs(mess,f);
    printf("%s\n",mess);
    fgets(mess,sizeof(mess),f2);
    printf("%s",mess);
    fclose(f);
    fclose(f2);
    return 0;
}

all works exelent
297
18 апреля 2011 года
koodeer
1.2K / / 02.05.2009
Цитата: Alm3n
 
Код:
...
char mess[10]={0};
...
scanf("%s",mess);
...

all works exelent


*Берёт топор, сооружает эшафот.
- Любезный, снимайте штаны, садитесь на плаху. Будем рубить руки.

Аналогичная претензия: переполнение буфера.
Избежать можно так:

 
Код:
char mess[10]={0};
scanf("%9s",mess); // один символ на терминальный ноль
316
18 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: koodeer

Аналогичная претензия: переполнение буфера.


Ну вы нашли к чему придраться. :)

61K
23 апреля 2011 года
TauRN7
24 / / 30.12.2010
Такс, сорри что долго не отвечал.
Спасибо за кодэ, всё сохраняется как надо = НО отображаются та в консоли всёравно краказябы!

316
23 апреля 2011 года
Alm3n
889 / / 29.05.2009
внезапно
[ATTACH=CONFIG]5078[/ATTACH]
61K
23 апреля 2011 года
TauRN7
24 / / 30.12.2010
Цитата: Alm3n
внезапно
[ATTACH=CONFIG]5078[/ATTACH]


ну а чтение из файла та всёравно коряво

316
24 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: TauRN7
ну а чтение из файла та всёравно коряво


вовсе нет
[ATTACH=CONFIG]5080[/ATTACH]

260
24 апреля 2011 года
Ramon
1.1K / / 16.08.2003
Код:
#include <stdio.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "");

    if (FILE* fd = fopen("test.txt", "w+"))
    {
        char tst[] = "Тест";

        fprintf(fd, "%s", tst);
        rewind(fd);
        fscanf(fd, "%4s", tst);

        printf("%s", tst);

        fclose(fd);
    }
   
    return 0;
}


Прекращайте писать не по стандарту.

PS: Мне также жаль пользователей которые будут использовать поделки бывших студентов у которых был такой препод.
61K
24 апреля 2011 года
TauRN7
24 / / 30.12.2010
Alm3n

И я не могу не заметить что шрифт вашей консольки несколько отличен от моей.

Ramon


Всё это печально. Курсач стоит только из-за этой проблемы, напомню:
-ввод информации
-сохранение её
-вывод её же из файла

какой бы способ не предлагали - в одном случае корявая запись, в другом отображение, в третьем чтение...
316
24 апреля 2011 года
Alm3n
889 / / 29.05.2009
Цитата: Ramon

Прекращайте писать не по стандарту.


о каком стандарте идет речь? этот код одинаково плохо будет работать и на cl, и на gcc. и не нужно говорить плохое о преподователе, он весьма профессионален. кажется очевидным, что тред совсем не о правильном открытии файла и мой код был сделан на скорую руку без всяких проверок.
[QUOTE=TauRN7;]
И я не могу не заметить что шрифт вашей консольки несколько отличен от моей.
[/QUOTE]
Lucide Console

61K
24 апреля 2011 года
TauRN7
24 / / 30.12.2010
Вот а какбы её какраз таки установить? т.е. НЕ ручками у своей консоли, а программно поменять - я так и не нашёл когда искал, потомучто как говорили это единственное решение с этими кодировками..
316
24 апреля 2011 года
Alm3n
889 / / 29.05.2009
http://www.rsdn.ru/forum/winapi/3601502.flat.aspx
сам не пробовал, но выглядит правдоподобно. еще есть вариант с ключиками реестра, но не знаю, есть ли в win 7 ключик, отвечающий за шрифт в консоли
260
24 апреля 2011 года
Ramon
1.1K / / 16.08.2003
Поковыряйтесь лучше в своем окружении вида оси и ее региональных настройках.

PS: Пишете Ц приложение пишите с использованием Ц библиотеки. А если у препода юникод используется только азиатами то все ясно с этим преподом.
61K
24 апреля 2011 года
TauRN7
24 / / 30.12.2010
Вы както говорите загадками, и причем тут юникод да тип wchar_t? Я лишь слышал что он исп для азиатским иероглифов, и только, а применение и надобность вичар_ти я не знаю, всмысле надобности просто напросто не вижу.
61K
26 апреля 2011 года
TauRN7
24 / / 30.12.2010
аш с 2003 года нет решения, ну и ну..
316
26 апреля 2011 года
Alm3n
889 / / 29.05.2009
SetConsoleFont не помог?
61K
27 апреля 2011 года
TauRN7
24 / / 30.12.2010
когдат натыкался на неё, т.к. во многих ветках форумов всё упирается в неё.. А т.к. она недокументированная - что странно, то и инфы мало.. Т.е. вот протатип, а как чтото конкретное устанавливать - хз
316
28 апреля 2011 года
Alm3n
889 / / 29.05.2009
пощелкай и посмотри, какая кодировка подойдет. у меня люсида была под индексом 8 на виртуалке. на хосте вообще не заработало почему-то. все еще есть вариант с реестром. записав соответствующие значения в реестр в HKEY_CURRENT_USER\Console. что туда писать можно узнать, щелкнув правой кнопкой мыши по заголовку окна консоли, настроив ее и посмотрев потом, что записалось в эту ветку реестра.
[ATTACH]5095[/ATTACH]
61K
29 апреля 2011 года
TauRN7
24 / / 30.12.2010
Это будет сдача курсового проекта, естественно ничего менять в реестре нельзя бует в презентационном компьютере.
316
29 апреля 2011 года
Alm3n
889 / / 29.05.2009
тогда, только CharToOem\OemToChar. перегрузить вставку в поток\чтени из потока и будет счастье.
61K
30 апреля 2011 года
TauRN7
24 / / 30.12.2010
Ох.. ну придётся разбираться
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог