- 论坛徽章:
- 0
|
本帖最后由 ztkx 于 2011-04-02 23:41 编辑
需要用到libiconv作转换,从一个文件转换到另一个文件,但是我试了一下,总是在若干行之后,抛出 SIGSEGV信号,
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include <iconv.h>
- #define BUF_SIZE 1024 //
- /* iconv 的封装 */
- size_t recode ( char **in_buf, size_t *in_len, char **out_buf, size_t *out_len );
- int
- main ( int argc, char *argv[] )
- {
- FILE *fp;
- size_t i = 0;
- size_t lines = 0;
- size_t rc = 0;
- char in_buf[BUF_SIZE] = {'\0'};
- char out_buf[BUF_SIZE] = {'\0'};
- size_t in_len = 0;
- size_t out_len = BUF_SIZE;
- char *pin = (char *) in_buf;
- char *pout = (char *)out_buf;
- char *src_file;
- if ( argc != 2 ) {
- printf ( "Usage: %s txt_file\n", argv[0] );
- return EXIT_FAILURE;
- }
- src_file = argv[1];
- fp = fopen(src_file, "r");
- /* 按行读取文件内容,进行编码转换 */
- while ( NULL != fgets(pin, BUF_SIZE, fp) ) {
- /*printf ( "pin is %s\n", pin );*/
- in_len = strlen(pin);
- rc = recode(&pin, &in_len, &pout, &out_len);
- if ( 0 == rc ) {
- printf ( "out is %s\n", out_buf);
- }
- pout = (char *)out_buf;
- printf ( "lines %d\n", ++lines );
- }
- fclose(fp);
- return EXIT_SUCCESS;
- } // ---------- end of function main ----------
- size_t
- recode ( char **in_buf, size_t *in_len, char **out_buf, size_t *out_len )
- {
- size_t rc = 0;
- iconv_t __iconv;
- __iconv = iconv_open("GBK", "UTF-8");
- if ( (iconv_t)-1 == __iconv ) {
- return EXIT_FAILURE;
- }
-
- rc = iconv(__iconv, in_buf, in_len, out_buf, out_len);
- if ( 0 != *in_len ) {
- printf ( "transform failure\n" );
- return EXIT_FAILURE;
- }
- if ( iconv_close(__iconv) ) {
- return EXIT_FAILURE;
- }
- return rc;
- } // ----- end of function recode -----
复制代码 这里,每次取一行,作转换,但是每次运行到特定行(如果使用不同的文件,行数是不一样的)的时侯,就会抛出SIGSEGV信号,rc和lines变量会被更改为一个特定的大数,
我想和文本文件没什么关系,如果只是输出,就没问题。 |
|