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);
использование 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);
траблы с использованием второй функции.
Вот кусок кода
Код:
компилятор, естественно, ругается:
invalid conversion from 'char**' to 'const char**'. А я не понимаю, как я могу использовать константу, если пользователь может поменять текст.
Подскажите, пожалуйста, что надо сделать, чтобы все заработало или расскажите как надо юзать эту библиотеку. /*Если можно, с примером кода*/
Я его не так давно учить стал (вместе с С++) так что могу и ошибиться.
Если ошибка в строчке с вызовом iconv, то может попробывать.
char *textin, *textout;
iconv(cd,&textin, length, &textout, length);
Цитата:
Originally posted by bqserg
Вообще-то есть форум Microsoft Visual C++.
Вообще-то есть форум Microsoft Visual C++.
Вообще-то к MSVC эта тема не имеет никакого отношения. Она либо тут, либо в программировании под юникс/линукс.
Цитата:
Originally posted by Sasha C
траблы с использованием второй функции.
компилятор, естественно, ругается:
invalid conversion from 'char**' to 'const char**'. А я не понимаю, как я могу использовать константу, если пользователь может поменять текст.
траблы с использованием второй функции.
компилятор, естественно, ругается:
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** нашел?
дай полный код пожалуйста... может не на то ругается? ;)
В общем, есть у меня приложение Bloodshed Dev-C++. И вместе с ним поставлялся пакет библиотек, в числе которых была и libiconv. И там прототип, такой, какой я указывал выше.
Да, и если в гугле набрать libiconv, то кликнув по первой ссылке и посмотрев мануал по функции iconv, можно увидеть:
Код:
size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);
А где можно надыбать библиотеку с тем другим прототипом? Можно ссылочку?
Цитата:
Originally posted by Sasha C
А где можно надыбать библиотеку с тем другим прототипом? Можно ссылочку?
А где можно надыбать библиотеку с тем другим прототипом? Можно ссылочку?
прототип можно глянуть в любой Linux системе в файле
/usr/include/iconv.h
проверено на Slackware 10 и RHEL AS 3.
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;
}
{
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;
}
{
const char **text;
*text="abc";
printf("%s\n",*text);
// предположим, что по 0xbbbb4432
// у нас тоже что то лежит
**text="0xbbbb4432";
printf("%s\n",*text);
return 0;
}
даже не откомпилится :)
если я неправ, пусть программеры меня поправят
Я по-разному менял код, чтобы справится с данной проблемой, например так:
Код:
iconv_t cd;
size_t length;
const char **textin;
char **textout;
*textin = textbuf->text();
size_t length;
const char **textin;
char **textout;
*textin = textbuf->text();
все компилируется, но при выполнении программы вылетает виндовозовская ошибка. В textbuf->text()
строка типа char*. И происходит это именно из-за последней строки - проверял. Какой код надо написать, чтобы передать текст из textbuf->text() в iconv и все было пучком?
Цитата:
Originally posted by Sasha C
К сожалению, Linux на своем компьютере я грохнул, поменяв клавиатуру, а переставить все времени нет.
Я по-разному менял код, чтобы справится с данной проблемой, например так:
все компилируется, но при выполнении программы вылетает виндовозовская ошибка. В textbuf->text()
строка типа char*. И происходит это именно из-за последней строки - проверял. Какой код надо написать, чтобы передать текст из textbuf->text() в iconv и все было пучком?
К сожалению, Linux на своем компьютере я грохнул, поменяв клавиатуру, а переставить все времени нет.
Я по-разному менял код, чтобы справится с данной проблемой, например так:
Код:
iconv_t cd;
size_t length;
const char **textin;
char **textout;
*textin = textbuf->text();
size_t length;
const char **textin;
char **textout;
*textin = textbuf->text();
все компилируется, но при выполнении программы вылетает виндовозовская ошибка. В textbuf->text()
строка типа char*. И происходит это именно из-за последней строки - проверял. Какой код надо написать, чтобы передать текст из textbuf->text() в iconv и все было пучком?
поробуй явно выделять память под *textin