免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2485 | 回复: 0
打印 上一主题 下一主题

[C] 帮忙看看这个iconv的例子 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-02 23:29 |只看该作者 |倒序浏览
本帖最后由 ztkx 于 2011-04-02 23:41 编辑

需要用到libiconv作转换,从一个文件转换到另一个文件,但是我试了一下,总是在若干行之后,抛出 SIGSEGV信号,


  1. #include        <stdio.h>
  2. #include        <string.h>
  3. #include        <ctype.h>
  4. #include        <stdlib.h>

  5. #include        <iconv.h>

  6. #define        BUF_SIZE 1024                        //


  7. /* iconv 的封装 */
  8. size_t recode ( char **in_buf, size_t *in_len, char **out_buf, size_t *out_len );

  9.         int
  10. main ( int argc, char *argv[] )
  11. {
  12.         FILE *fp;
  13.         size_t i = 0;
  14.         size_t lines = 0;
  15.         size_t rc = 0;
  16.         char in_buf[BUF_SIZE] = {'\0'};
  17.         char out_buf[BUF_SIZE] = {'\0'};

  18.         size_t in_len = 0;
  19.         size_t out_len = BUF_SIZE;

  20.         char *pin = (char *) in_buf;
  21.         char *pout = (char *)out_buf;
  22.         char *src_file;

  23.         if ( argc != 2 ) {
  24.                 printf ( "Usage: %s txt_file\n", argv[0] );
  25.                 return EXIT_FAILURE;
  26.         }
  27.         src_file = argv[1];

  28.         fp = fopen(src_file, "r");

  29. /* 按行读取文件内容,进行编码转换 */
  30.         while ( NULL != fgets(pin, BUF_SIZE, fp) ) {
  31.                 /*printf ( "pin is %s\n", pin );*/
  32.                 in_len = strlen(pin);

  33.                 rc = recode(&pin, &in_len, &pout, &out_len);

  34.                 if ( 0 == rc ) {
  35.                         printf ( "out is %s\n", out_buf);
  36.                 }

  37.                 pout = (char *)out_buf;
  38.                 printf ( "lines %d\n", ++lines );   
  39.         }

  40.         fclose(fp);

  41.         return EXIT_SUCCESS;
  42. }                                // ----------  end of function main  ----------


  43.         size_t
  44. recode ( char **in_buf, size_t *in_len, char **out_buf, size_t *out_len )
  45. {
  46.         size_t rc = 0;
  47.         iconv_t __iconv;

  48.         __iconv = iconv_open("GBK", "UTF-8");

  49.         if ( (iconv_t)-1 == __iconv ) {
  50.                 return EXIT_FAILURE;
  51.         }
  52.         
  53.         rc = iconv(__iconv, in_buf, in_len, out_buf, out_len);

  54.         if ( 0 != *in_len ) {
  55.                 printf ( "transform failure\n" );
  56.                 return EXIT_FAILURE;
  57.         }

  58.         if ( iconv_close(__iconv) ) {
  59.                 return EXIT_FAILURE;
  60.         }

  61.         return rc;
  62. }                // -----  end of function recode  -----


复制代码
这里,每次取一行,作转换,但是每次运行到特定行(如果使用不同的文件,行数是不一样的)的时侯,就会抛出SIGSEGV信号,rc和lines变量会被更改为一个特定的大数,

我想和文本文件没什么关系,如果只是输出,就没问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP