msys環境での実行

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カヌー
記事: 45
登録日時: 11年前

msys環境での実行

#1

投稿記事 by カヌー » 10年前

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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: msys環境での実行

#2

投稿記事 by みけCAT » 10年前

  • src_lenおよびdst_lenの型がsize_tではない
  • src_lenの値が不定もしくは意味の無いデータから計算され、そのままiconv関数に渡されている
のがまずいと思います。
Man page of ICONV
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

カヌー
記事: 45
登録日時: 11年前

Re: msys環境での実行

#3

投稿記事 by カヌー » 10年前

src_lenの値を与える場所変えたらできました!型はintでもできたのですがsize_tのがよいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: msys環境での実行

#4

投稿記事 by みけCAT » 10年前

カヌー さんが書きました:src_lenの値を与える場所変えたらできました!型はintでもできたのですがsize_tのがよいのでしょうか?
size_tの方がよさそうだと思います。警告が出ませんでしたか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

カヌー
記事: 45
登録日時: 11年前

Re: msys環境での実行

#5

投稿記事 by カヌー » 10年前

特に警告はでませんでした

カヌー
記事: 45
登録日時: 11年前

Re: msys環境での実行

#6

投稿記事 by カヌー » 10年前

ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る