除了iconv命令,我們?cè)趌inux系統(tǒng)下的man page的第三節(jié)還可以看到一組iconv函數(shù)。它們分別是
創(chuàng)新互聯(lián)建站是一家企業(yè)級(jí)云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營(yíng)經(jīng)驗(yàn)。主營(yíng)GPU顯卡服務(wù)器,站群服務(wù)器,遂寧聯(lián)通機(jī)房,海外高防服務(wù)器,成都機(jī)柜租用,動(dòng)態(tài)撥號(hào)VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。
iconv_t iconv_open(const char *tocode, const char *fromcode);
size_ticonv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
int iconv_close(iconv_t cd);
iconv_open函數(shù)用來(lái)打開(kāi)一個(gè)編碼轉(zhuǎn)換的流,iconv函數(shù)的作用是實(shí)際進(jìn)行轉(zhuǎn)換,iconv_close函數(shù)的作用就是關(guān)閉這個(gè)流。實(shí)際用法參見(jiàn)下面的例子,下面是一個(gè)將UTF-8碼轉(zhuǎn)換成GBK碼的例子,我們假設(shè)已經(jīng)有了一個(gè)uft8編碼的輸入緩沖區(qū)inbuf以及這個(gè)緩沖區(qū)的長(zhǎng)度inlen。
iconv_t cd = iconv_open( "GBK", "UTF-8");
char *outbuf = (char *)malloc(inlen * 4 );
bzero( outbuf, inlen * 4);
char *in = inbuf;
char *out = outbuf;
size_t outlen = inlen *4;
iconv(cd, in, (size_t *)inlen, out,outlen);
outlen = strlen(outbuf);
printf("%s\n",outbuf);
free(outbuf);
iconv_close(cd);
#include iconv.h
size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
你看函數(shù)原型, outbuf是一個(gè) char **類(lèi)型
在函數(shù)手冊(cè)中:
The iconv() function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements
*inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted
output bytes
也就是說(shuō),當(dāng)你執(zhí)行過(guò)iconv以后,*outbuf所指向的內(nèi)存空間位置已經(jīng)被改掉了, 所以你任何時(shí)候去讀*outbuf, 都是讀不到任何iconv后的數(shù)據(jù)的(都在*outbuf這個(gè)指針前面放著呢)。
所以你應(yīng)該 預(yù)先備份outbuf的數(shù)據(jù),
比如 char k[1000]; char *outb = k; 執(zhí)行完iconv(t,inb,inl,outb,outl)以后,你去讀k數(shù)組就可以了。
我覺(jué)得這是文件編碼的問(wèn)題,就是說(shuō)linux下的文件編碼一般情況下是utf-8的,所以就出現(xiàn)這個(gè)問(wèn)題了。
1、基本思路:從第一個(gè)文本文件中用
fgets()
函數(shù)讀出一行數(shù)據(jù),對(duì)讀出的每一行數(shù)據(jù)進(jìn)行判斷,如果需要在它的適當(dāng)位置插入一行,把相應(yīng)的新內(nèi)容、以及該行的內(nèi)容寫(xiě)到第二個(gè)文本文件中。如果不需要在該位置插入一行,那就直接將該行數(shù)據(jù)用
fprintf()
函數(shù)寫(xiě)入第二個(gè)文本文件中。
2、偽代碼:
1.打開(kāi)要修改的文件A,
2.創(chuàng)建一個(gè)臨時(shí)文件B,
3.
while(沒(méi)到達(dá)文件A末尾)
從A中讀取一行,寫(xiě)到B中,然后寫(xiě)入要追加的內(nèi)容,寫(xiě)入換行符
4.關(guān)閉文件A,關(guān)閉文件B,
5.刪除文件A(用remove函數(shù)),重命名B為A(用rename函數(shù))