質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • C

    3816questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

gccによる文字コード変換

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,578

kt3302y

score 19

今回、C言語でファイルを読み込みそのファイルの文字コードをShift-JISに変換するプログラムを作成したのですが,変換後の文字が以下のソースコードを使用すると表示されません.どこがおかしいのか教えてください.引数としては第一引数に使用するファイル名,第二引数にはそのファイルの文字コードを指定してあります.


#include <stdio.h>
#include <string.h>
#include <iconv.h>
#define N 100
#define L 1000

/* コード内に与えられた文字列の文字コード変換を行う */
int main(int argc, char *argv[]) {
    char src[L];
    char dst[L];
    int src_len =0;
    int dst_len = sizeof(dst) - 1;
    char *buf_in;
    char *buf_out;
    char *code;
    char *filename;
    iconv_t conv;
    FILE *fp;
    
    filename = argv[1];
    src_len = strlen(filename);
    code = argv[2];
    
    fp = fopen(filename,"r");
    while(fgets(src,L,fp) != NULL)
    {
    
    /* 文字コード前の文字列を表示 */
    fprintf(stderr, "Before: %s\n", src);

    /*
     * src, dst は配列であり,そのまま iconv() 関数に &src, &dst
     * と渡せないため,いったん別のポインタ変数に渡す
     */
    buf_in = src;
    buf_out = dst;

    /* UTF-8 から Shift-JIS への変換器を作成 */
    conv = iconv_open("Shift-JIS",code );

    /* 変換 */
    iconv(conv, &buf_in, &src_len, &buf_out, &dst_len);
    
    /*文末処理*/
    *buf_out = '\0';
    
    /* 変換器を終了 */
    iconv_close(conv);
    
    /* 文字コード後の文字列を表示 */
    fprintf(stderr, "After: %s\n", dst);

    }
    fclose(fp);
    return 0;
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

src_len は変換元の文字列の長さを指定しますが、ファイルの文字列長をセットしているため
変換に失敗→NULLセットで何も表示されていない。と想定します。

下記では変換できました。
お試しください。

#include <stdio.h>
#include <string.h>
#include <iconv.h>
#define N 100
#define L 1000

/* コード内に与えられた文字列の文字コード変換を行う */
int main(int argc, char *argv[]) {
    char src[L];
    char dst[L];
    //int src_len =0;
    //int dst_len = sizeof(dst) - 1;
    size_t src_len =0;
    size_t dst_len = sizeof(dst) - 1;
    char *buf_in;
    char *buf_out;
    char *code;
    char *filename;
    iconv_t conv;
    FILE *fp;

    filename = argv[1];
    code = argv[2];

    fp = fopen(filename,"r");
    while(fgets(src,L,fp) != NULL) {

        fprintf(stderr, "Before: %s", src);

        buf_in = src;
        src_len = strlen(src);  // ここに移動
        buf_out = dst;

        conv = iconv_open("SHIFT-JIS",code );
        if(conv == (iconv_t)-1){
            perror("iconv open");
            return -1;
        }

        if (iconv(conv, &buf_in, &src_len, &buf_out, &dst_len) == -1) {
            perror("iconv");
            return -1;
        }

        *buf_out = '\0';
        iconv_close(conv);

        fprintf(stderr, "After: %s\n", dst);

    }
    fclose(fp);
    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

気がついたこと:ポインタの使い方が変です。
p = fopen(*filename,"r");->p = fopen(filename,"r");
conv = iconv_open("Shift-JIS",*code );->conv = iconv_open("Shift-JIS",code );

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C言語 fopen パス指定

    初歩的な質問になってしまいます。 ファイルのパスを指定してfopenをしたいのですが、うまくいかなかったので質問させていただきます。 OSはLinuxです。 まず buf[]="

  • 解決済

    英文ファイルを表示

    ある英文が与えられたファイルがあり,それを所有格や空白記号類を削除し単語一つ一つを改行して表示していくプログラムを考えています. 実行結果の例としては This is a pen.

  • 受付中

    C言語 文字列の入力についての質問です

    C言語の文字列入力について質問です。 例えば、 homy tomi sami tani sai tom rari rare tara 等の不定個の名前が2行にわたってあるとし

  • 解決済

    C言語でテキストファイルの行削除

    C言語でテキストファイルの指定した行の削除を行いたいです。 sample.txtが >giaaaaaaaa hoge fuga piyo となっているときに、>giの行を削除し

  • 解決済

    fprintfの中身をおしえて

    プログラムの中にfprintf(dst, "%0*X ", (CHAR_BIT + 3) / 4, (unsigned)buf[i]); の表示がありますが、(CHAR_BIT

  • 解決済

    cp -r コマンドのC言語による実装

    前提・実現したいこと ls -r コマンドのC言語のソースコードを参考にして cp -r コマンドを実装しているのですが どこを変えていいのかわかりません… 該当のソー

  • 解決済

    あと少しなんですがうまくいきません、、、

    C C言語で 各学生の学籍番号・物理の点数・化学の点数の組がスペース区切りで一行に記述されたファイルを読み込み,全学生の物理の平均点・最高点・最低点,および化学の平均点・最高点・最

  • 受付中

    ファイル名指定のファイルの行数と文字数

     前提・実現したいこと コマンド行引数として与えられたファイル名をもつファイルの中身を調べ、 その行数と文字数(改行文字も文字として数える)とをこの順に標準出力に書き出します。 行

同じタグがついた質問を見る

  • C

    3816questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。