ページ 11

msys環境での実行

Posted: 2015年7月14日(火) 18:31
by カヌー
msys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.何がいけないのでしょうか.文字コードの変換にはiconvを使用.第1引数に変換対象のファイル名,第2引数にファイルの文字コードを指定しています(argv[1]にファイル名,argv[2]に文字コードが格納されているということです).

コード:

#include <stdio.h>
#include <string.h>
#include <iconv.h>


int main(int argc, char *argv[]) 
{
    iconv_t conv;
    char src[10000];
    char dst[10000];
    int src_len = strlen(src);
    int dst_len = sizeof(dst) - 1;
    char *buf_in;
    char *buf_out;

    FILE *fp;

    fp = fopen(argv[1], "r");

    if(NULL == fp)
    {
        printf("ファイルを開けません\n");
    }
    else
    {
        while(fgets(src, 10000, fp) != NULL)
        {
            buf_in = src;
            buf_out = dst;

            /* 変換器を作成 */
            conv = iconv_open("Shift-JIS", argv[2]);

           /* 変換 */
           iconv(conv, &buf_in, &src_len, &buf_out, &dst_len);

           *buf_out = '\0'; /* 終末処理 */

           /* 文字コード後の文字列を表示 */
            printf("%s\n", dst);
        }

        /* 変換器を終了 */
        iconv_close(conv);

        /*ファイルを閉じる*/
        fclose(fp);

    }

    return 0;
}

Re: msys環境での実行

Posted: 2015年7月14日(火) 20:08
by みけCAT
  • src_lenおよびdst_lenの型がsize_tではない
  • src_lenの値が不定もしくは意味の無いデータから計算され、そのままiconv関数に渡されている
のがまずいと思います。
Man page of ICONV

Re: msys環境での実行

Posted: 2015年7月14日(火) 20:49
by カヌー
src_lenの値を与える場所変えたらできました!型はintでもできたのですがsize_tのがよいのでしょうか?

Re: msys環境での実行

Posted: 2015年7月14日(火) 22:20
by みけCAT
カヌー さんが書きました:src_lenの値を与える場所変えたらできました!型はintでもできたのですがsize_tのがよいのでしょうか?
size_tの方がよさそうだと思います。警告が出ませんでしたか?

Re: msys環境での実行

Posted: 2015年7月14日(火) 22:53
by カヌー
特に警告はでませんでした

Re: msys環境での実行

Posted: 2015年7月14日(火) 23:49
by カヌー
ありがとうございました!