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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

2回答

7731閲覧

gccによる文字コード変換

kt3302y

総合スコア27

C

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

0グッド

0クリップ

投稿2015/07/04 05:13

編集2015/07/04 06:11

今回、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;

}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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;

}

投稿2015/07/04 07:31

kurosawa

総合スコア780

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2015/07/04 05:39

編集2015/07/04 05:46
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問