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

Ваш аккаунт

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

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

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

использование libiconv для перекодировки

11K
24 ноября 2005 года
Sasha C
14 / / 20.10.2005
Необходимо использовать библиотеку libiconv для перекодировки текста. Не получается...
Не понимаю работы этой библиотеки. В ней есть всего 3 нужных функции.

iconv_t iconv_open (const char* tocode, const char* fromcode);

size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);

int iconv_close (iconv_t cd);

траблы с использованием второй функции.

Вот кусок кода

Код:
iconv_t cd;
  size_t *length;
  char **textin;
  char **textout, *tempstr;
  tempstr = textbuf->text();
  int i = 0;
  int k = 0;
  int l = 0;
  while(tempstr != '\0')
    { if(tempstr == '\n')
       { textin[k][l] = '\0'; k++; length[k] = l; l = 0;}
      else
       { textin[k][l] = tempstr; l++; i++;}
    }
  cd = iconv_open ("CP866", "CP1251");  
  iconv (cd,textin, length, textout, length);  
  iconv_close (cd);


компилятор, естественно, ругается:
invalid conversion from 'char**' to 'const char**'. А я не понимаю, как я могу использовать константу, если пользователь может поменять текст.

Подскажите, пожалуйста, что надо сделать, чтобы все заработало или расскажите как надо юзать эту библиотеку. /*Если можно, с примером кода*/
9.8K
24 ноября 2005 года
bqserg
56 / / 27.09.2005
Вообще-то есть форум Microsoft Visual C++.

Я его не так давно учить стал (вместе с С++) так что могу и ошибиться.

Если ошибка в строчке с вызовом iconv, то может попробывать.

char *textin, *textout;

iconv(cd,&textin, length, &textout, length);
4
24 ноября 2005 года
mike
3.7K / / 01.10.2002
Цитата:
Originally posted by bqserg
Вообще-то есть форум Microsoft Visual C++.



Вообще-то к MSVC эта тема не имеет никакого отношения. Она либо тут, либо в программировании под юникс/линукс.

2
25 ноября 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by Sasha C

траблы с использованием второй функции.

компилятор, естественно, ругается:
invalid conversion from 'char**' to 'const char**'. А я не понимаю, как я могу использовать константу, если пользователь может поменять текст.



что то ты не то юзаешь. что значит "естественно ругается"? во второй функции нет const char**

 
Код:
size_t iconv(iconv_t cd,char **inbuf, size_t *inbytesleft,char **outbuf, size_t *outbytesleft);

вот ее прототип. где ты там const char** нашел?
дай полный код пожалуйста... может не на то ругается? ;)
11K
28 ноября 2005 года
Sasha C
14 / / 20.10.2005
На то, на то.
В общем, есть у меня приложение Bloodshed Dev-C++. И вместе с ним поставлялся пакет библиотек, в числе которых была и libiconv. И там прототип, такой, какой я указывал выше.
Да, и если в гугле набрать libiconv, то кликнув по первой ссылке и посмотрев мануал по функции iconv, можно увидеть:

 
Код:
size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);


А где можно надыбать библиотеку с тем другим прототипом? Можно ссылочку?
2
28 ноября 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by Sasha C

А где можно надыбать библиотеку с тем другим прототипом? Можно ссылочку?


прототип можно глянуть в любой Linux системе в файле
/usr/include/iconv.h
проверено на Slackware 10 и RHEL AS 3.

2
28 ноября 2005 года
squirL
5.6K / / 13.08.2003
в любом случае - не понимаю, что мешает вам изменять содержимое исходного буффера? насколько я помню С, объявление
const char** str запрещает вам менять сам указатель, но не то, на что он указывает.
 
Код:
int main(int argc, char* argv[])
{
        const char **text;

        *text="abc";
        printf("%s\n",*text);
        *text="bca";
        printf("%s\n",*text);
        return 0;
}

вот такой код отработает без проблем. а вот такой:
Код:
int main(int argc, char* argv[])
{
        const char **text;

        *text="abc";
        printf("%s\n",*text);
// предположим, что по 0xbbbb4432
// у нас тоже что то лежит
        **text="0xbbbb4432";
        printf("%s\n",*text);
        return 0;
}

даже не откомпилится :)

если я неправ, пусть программеры меня поправят
11K
29 ноября 2005 года
Sasha C
14 / / 20.10.2005
К сожалению, Linux на своем компьютере я грохнул, поменяв клавиатуру, а переставить все времени нет.

Я по-разному менял код, чтобы справится с данной проблемой, например так:

 
Код:
iconv_t cd;
  size_t length;
  const char **textin;
  char **textout;
  *textin = textbuf->text();


все компилируется, но при выполнении программы вылетает виндовозовская ошибка. В textbuf->text()
строка типа char*. И происходит это именно из-за последней строки - проверял. Какой код надо написать, чтобы передать текст из textbuf->text() в iconv и все было пучком?
2
29 ноября 2005 года
squirL
5.6K / / 13.08.2003
Цитата:
Originally posted by Sasha C
К сожалению, Linux на своем компьютере я грохнул, поменяв клавиатуру, а переставить все времени нет.

Я по-разному менял код, чтобы справится с данной проблемой, например так:

 
Код:
iconv_t cd;
  size_t length;
  const char **textin;
  char **textout;
  *textin = textbuf->text();


все компилируется, но при выполнении программы вылетает виндовозовская ошибка. В textbuf->text()
строка типа char*. И происходит это именно из-за последней строки - проверял. Какой код надо написать, чтобы передать текст из textbuf->text() в iconv и все было пучком?


поробуй явно выделять память под *textin

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог