C言語でファイルの文字コードをShift-JISに変換して表示する方法

このQ&Aのポイント
  • C言語でmsys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.
  • 質問者はC言語のプログラムを作成しており,msys環境で動作させています。プログラムは指定されたファイルの文字コードをShift-JISに変換して表示するものですが、正しく動作しない問題が発生しています。
  • C言語を使い、msys環境で動作させているプログラムで、指定されたファイルの文字コードをShift-JISに変換して表示する処理を行っています。しかし、期待した結果が得られず、うまく表示されない問題が発生しています。
回答を見る
  • ベストアンサー

c言語 iconv

msys環境で実行して,指定されたファイルの文字コードをShift-JISに変換して表示するコードを作成しているのですがうまく表示されません.何がいけないのでしょうか.第1引数に変換対象のファイル名,第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; }

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.1

fp = fopen(argv[1], "r"); を fp = fopen(argv[1], "rt"); にしてみたらどうなりますか? fgets系のioルーチンを使う場合、ストリームのオープンタイプが「テキストモード」じゃないと、何が起こるか判りません。

caneo_bote
質問者

お礼

解決しました!お二人の方ありがとうございました

caneo_bote
質問者

補足

うーん,変わりませんでした.変換前のファイルの文字は表示できるので変換の所で問題があると思うのですが,どうでしょう?

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

「うまく表示されません」というのは具体的に、どういう環境(実行時に使用している端末ソフトおよびその文字コードの設定など)で表示されないのですか?

caneo_bote
質問者

補足

表示されないというのは変換後の文字が表示できないということで実行)はできています.コードの問題だと思うのですが環境は関係あるのでしょうか?

関連するQ&A

  • BCCデベロッパーでiconv

    c言語でのプログラミングをBCC developer(windowsXP)で行ってるものです。 iconv.hとインクルードしたくて C:\Borland\BCC55\Include ファイルにlibiconv-1.9.1.bin.woe32にあるincludeファイルにあった iconv.h libcharset.h localcharset.h という三つのファイルをコピペした後、次のプログラムをmakeしてみました #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> #define S_SIZE (1024) int main(void) { iconv_t icd; FILE *fp_src, *fp_dst; char s_src[S_SIZE], s_dst[S_SIZE]; char *p_src, *p_dst; size_t n_src, n_dst; icd = iconv_open("EUC-JP", "UTF-8"); fp_src = fopen("index1.txt", "r"); fp_dst = fopen("index2.txt", "w"); while(fgets(s_src, S_SIZE, fp_src) != NULL){ p_src = s_src; p_dst = s_dst; n_src = strlen(s_src); n_dst = S_SIZE-1; while(0 < n_src){ iconv(icd, &p_src, &n_src, &p_dst, &n_dst); } *p_dst = '\0'; fputs(s_dst, fp_dst); } fclose(fp_dst); fclose(fp_src); iconv_close(icd); } すると次のエラーメッセージが出ました。 Error: Unresolved external '_libiconv_open' referenced from C:\BORLAND\BCC55\BIN\TEST.C\DEBUG\TEST.OBJ Error: Unresolved external '_libiconv' referenced from C:\BORLAND\BCC55\BIN\TEST.C\DEBUG\TEST.OBJ Error: Unresolved external '_libiconv_close' referenced from C:\BORLAND\BCC55\BIN\TEST.C\DEBUG\TEST.OBJ ** error 1 ** deleting Debug\test.c.exe 解決策が分かる方、ご指導お願いいたします。

  • C言語の使い方を教えてください。-C言語入門者

    C言語のプログラムの処理の対象となるファイルはどこに保存したらよいのでしょうか?たとえば下記のプログラムで #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { char *line[100], *buf; int i = 0, len, lines; FILE *fp; fp = fopen("textfile.txt", "r"); buf = calloc(128, sizeof(char)); while (i < 100 && fgets(buf, 128, fp) != NULL) { len = strlen(buf); line[i] = calloc(len + 1, sizeof(char)); strcpy(line[i], buf); i++; } fclose(fp); lines = ((i <= 100) ? i :100); free(buf); for(i = 0; i < lines; i++) printf("%s", line[i]); for(i = 0; i < lines; i++) free(line[i]); } で [textfile.txt]という名のファイルをマイドキュメントやコンパイラーを保存しているのと同じ領域に保存してコンパイラーを実行しても所要の結果が得られません。テキストにはプログラムの作り方しか書いてありません。

  • C言語 Segmentation fault

    program SPROGRAM 17 4 pas104 SIDENTIFIER 43 4 ( SLPAREN 33 4 上記のようなファイルを読みこんで、1行づつ各トークン(programとか17とか)を構造体に格納する関数reader()を作りましたが、これを以下のparser.cで呼びだすと「Segmentation fault(core dumped)」となってしまいます。gdbのrunコマンドでプログラムを実行すると、関数を呼び出す所で Program received signal SIGSEGV, Segmentation fault. 0x0040140f in reader () と表示されました。が,どうすればよいか全然分かりません・・・ どうすれば正しく動作してくれるのか、どなたか教えてください・・・ 以下ソース /*read.c*/ #include "head.h" void reader(void) { fprintf(stdout,"check"); char buf[BUF_LEN]; if (fgets(buf,sizeof(buf),fp) == NULL)/*ここで1行読みこむ*/ {/*いきなりNULLの場合*/ strcpy(t.str, ""); t.num = SEOF; t.line = 1; } else { 省略 } return; } /*parser.c*/ #include "head.h" struct tokenbox t; FILE *fp; int main(int argc, char *argv[]) { if (argc != 2)/*引数チェック*/ { fprintf(stderr,"Usage: (./parser) (file.ts)\n"); return -1; } int len; len = strlen(argv[1]);/*file.ts の長さ取得*/ if((argv[1][len-1] == 's') && (argv[1][len-2] =='t') && (argv[1][len-3] == '.'))/*tsファイルが指定されているかどうか*/ { fp = fopen(argv[1],"r");/*ファイルオープン*/ if (fp == NULL) { fprintf(stderr,"Such ts file is not exist\n"); return -1; } fprintf(stdout,"authenticate ts file!\n");//←これは出力される reader(); //←ここでSegmentation faultと思われる printf("t.str = %s\n", t.str); printf("t.str[0] = %c\n", t.str[0]); printf("t.num = %d\n", t.num); printf("t.line = %d\n", t.line); fclose(fp); return 0; } else { fprintf(stderr,"the file is not ts\n"); return -1; } } ヘッダファイル一部抜粋 /*head.h*/ #include <stdio.h> #include <string.h> #include <stdbool.h> #define BUF_LEN 128 #define TOKEN_LEN 128 struct tokenbox {/*tsファイルの各情報を格納する構造体*/ char str[TOKEN_LEN]; int num; int line; }; extern struct tokenbox t;/*構造体をtと置く*/ extern FILE *fp; /*ファイルポインタ*/

  • C言語の関数の戻り値がおかしい?

    #include<stdio.h> #include<ctype.h> #include<stdlib.h> int get_word(char *buf,int buf_size,FILE *fp) { int len; int ch; while((ch = getc(fp)) != EOF && !isalnum(ch));/*→「英数字のとき」このループは飛ばす。*/ if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。*/ return EOF; } len = 0; do{ buf[len] = ch; len++; if(len >= buf_size){ fprintf(stderr,"word too long.\n"); exit(1); } }while((ch = getc(fp)) != EOF && isalnum(ch)); buf[len] = '\0'; return len; } int main(void) { char buf[256]; while(get_word(buf,256,stdin) != EOF){ printf("<<%s>>\n",buf); } return 0; } C言語ポインタ完全制覇という本のP67に載っていたプログラムをそのまま載せています。 get_word関数の中のif文で、EOFを返した時もループwhile(get_word(buf,256,stdin)により再入力するようなプログラムになっています。でも、「!=EOF」と記述されているのだから、EOFが返ったら終了だと思うのですが… なぜ再入力し続けるプログラム(無限ループ)になってしまっているのでしょうか? というか、私の環境で動作させたらおかしいだけじゃないでしょうか? よろしくお願いします。

  • iconv_open失敗

    いつもお世話になっております。 OpenIndiana NetBeansIDE 7.1でc++のプログラミングをしているのですが、下記コードで SHIFT-JISを指定すると iconv open: Invalid argument となってしまいます。 SHIFT-JISの文字コード関係の何かのインストール等が不足しているのでしょうか。 locale -a というコマンドを実行してみたのですが、 UTF-8に関係しそうなものは入っていたのですが、SHIFT-JIS(PCK?) のようなものは入ってなさそうでした。 どなたかご教授よろしくお願いいたします。 どなたかご教授よろしくお願いいたします。 int main(int argc, char** argv) { int ret; // ret = convert("UTF-8", "EUC-JP",//成功 // ret = convert("UTF-8", "SHIFT_JIS", ret = convert("UTF-8", "SHIFT-JIS", "日本語テストメッセージおはよう", outbuf, sizeof(outbuf)); if (ret) { printf("%s\n", outbuf); } else { printf("Oops!\n"); } return 0; } int convert(char const *src, char const *dest, char const *text, char *buf, size_t bufsize) { iconv_t cd; size_t srclen, destlen; size_t ret; cd = iconv_open(dest, src); if (cd == (iconv_t)-1) { perror("iconv open"); return 0; } srclen = strlen(text); destlen = bufsize - 1; memset(buf, '\0', bufsize); ret = iconv(cd, &text, &srclen, &buf, &destlen); if (ret == -1) { perror("iconv"); return 0; } iconv_close(cd); return 1; }

  • C言語→C#に変換

    C言語→C#に変換 C言語からC#に変換したいのですが、わからないところがあります。 コマンドライン引数からファイル名とキーワードを入力して、キーワードがある行をアウトプットファイルに書き込むという処理です。 C言語のソースは、 main(int argc,char *argv[]){ FILE *fp; FILE *fpp; int i; char KEYWORD[256]; char buf[256]; //(1)アウトプットファイルのオープン fpp=fopen("output.txt","w"); for(i=1;i<argc-1;i++){ if(strcmp(argv[i],"-a")==0){ //(2)入力ファイルのオープン if((fp=fopen(argv[i],"r"))==NULL){ printf("open error!\n"); exit(1); } } //(3)キーワードの代入 if(strcmp(argv[i],"-b")==0){ strcpy(KEYWORD,argv[i]); } } //(4)一行読み込む while(fgets(buf,sizeof(buf),fp)!=NULL){ //(5)キーワードの条件で文字列抽出 if(strstr(buf,KEYWORD)!=NULL){ //(6)アウトプットファイルに出力 fprintf(fpp,"%s",buf); } } //ファイルクローズ fclose(fp); fclose(fpp); } です。 (3)キーワードの代入と、(5)文字列抽出の部分がネットなどで調べてもよくわかりません。 分かる方いらっしゃいましたら教えていただけると幸いです。 宜しくお願いします。 .

  • C言語です。コレを使ってなにかプログラミングを組んでください

    C言語です。コレを使ってなにかプログラミングを組んでください よろしくお願いします 何でも構いません #include<stdio.h> void str_copy( char dst[], char src[] ) { int i; for (i =0; src[i] != '\0'; i++) { dst[i] = src[i]; } dst[i]= '\0'; }

  • C言語で分からない部分がいくつかあります。

    長文になります。 市のデータ(cities.txt)を対象として、以下の各機能を持ったプログラムを作成しました。 1.情報の登録と一覧表示 2.情報の削除 3.cities.txt からの情報の読み込み 4.citiesDB.txtへのリスト内容の書き出し 5.人口でソート #include <stdio.h> #include <stdlib.h> #include <string.h> #define STRLEN 32 #define BUF_LEN 128 #define CITYDB_R_FILE "cities.txt" // 読み込み用ファイル #define CITYDB_W_FILE "citiesDB.txt" // 書き出し用ファイル struct cities{ char pref[STRLEN]; char city[STRLEN]; int popl; float area; float dens; char founded[STRLEN]; struct cities *next; }; struct cities *root=NULL; // rootへのポインタは大域変数として定義 void *mymalloc(size_t sz){ void *p = (void *)malloc(sz); if(p == NULL){ fprintf(stderr,"ERR: Can't malloc memory %d bytes.",(int)sz); exit(1); } memset(p,0,sz); return p; } void showCity(struct cities *c, FILE *fp){ fprintf(fp,"%s\t%s\t%d\t%.2f\t%.2f\t%s\n", c->pref, c->city, c->popl, c->area, c->dens, c->founded); } struct cities *genNewCityCell(char *pref, char *city, int popl, float area, float dens, char *founded ){ struct cities *c; c = mymalloc(sizeof(struct cities)); // メモリを確保した c に対して、値を代入する return c; } void showList(FILE *fp){ struct cities *cur= root; while(cur != NULL){ showCity(cur,fp); cur = cur->next; } } void saveList(){ // 書き込み用のファイルを開き、そのファイルポインタ fp に対して、 // showList(fp) を呼ぶ。 void showList() は12行上で定義している printf("File saved to %s\n",CITYDB_W_FILE); } struct cities *line2City(char *buf){ struct cities *c=NULL; int popl; char pref[STRLEN], city[STRLEN], founded[STRLEN]; float area, dens; sscanf(buf, "%s %s %d %f %f %s", pref, city, &popl, &area, &dens, founded); c = genNewCityCell(pref,city,popl,area,dens,founded); return c; } void addCity(struct cities *c){ struct cities **cur= &root; /* rootから順にたどって,末尾に挿入する */ } void inputStr(char *buf,int len){ fgets(buf,len,stdin); buf[strlen(buf)-1]='\0'; } void addNewCity(){ char buf[BUF_LEN] = ""; struct cities *c; while(strlen(buf)<=0){ printf("Input one line:\n"); inputStr(buf, BUF_LEN); } if(strncmp(buf, "Prefecture", 10) == 0) return; c = line2City(buf); addCity(c); } void deleteCityFromList(char *delcity){ /* 順にたどり,当該項目を削除する. addCity() も同様. */ } void deleteCity(){ char buf[STRLEN]; showList(stdout); printf("Select Delete City Name:"); inputStr(buf, STRLEN); deleteCityFromList(buf); } void readListFILE(FILE *fp){ char buf[BUF_LEN]; struct cities *c; while( fgets(buf,BUF_LEN,fp) != NULL){ if(strncmp(buf, "Prefecture", 10) == 0) continue; c = line2City(buf); if(c != NULL) addCity(c); } } void readList(){ /* ファイルCITYDB_R_FILEを読み取り用で開く ファイルが開けない場合のエラー処理 readListFILE(fp); ファイルをクローズ */ printf("File loaded\n"); } void insertCityByPopl(struct cities *sc){ struct cities **cur= &root; /* 順にたどり、挿入すべき箇所に sc を挿入 */ } void sortList(){ struct cities *cur,*fr; cur = root; root = NULL; while(cur != NULL){ insertCityByPopl(genNewCityCell(cur->pref, cur->city, cur->popl, cur->area, cur->dens, cur->founded)); fr = cur; cur = cur->next; free(fr); } showList(stdout); } int main(int argc, char *argv[]){ char buf[BUF_LEN]; while(1){ printf("Menu(a:add, d:delete, l:list, s:sort, w:write file, r:read file q:quit):\n"); fgets(buf,BUF_LEN,stdin); switch(buf[0]){ case 'a': addNewCity(); break; case 'd': deleteCity(); break; case 'l': showList(stdout); break; case 's': sortList(); break; case 'w': saveList(); break; case 'r': readList(); break; case 'q': exit(0); break; } } } ただ、コメントのある部分の関数が完成できません・・・・ どなたか教えてください。

  • C言語に関する質問

    初めて質問させて頂きます。C言語初心者です。 実は講義で「ファイル中の英文を単語に分けてその出現頻度をカウントするコードを木構造を用いて出力せよ」という課題が出ました。 そこで、参考にするコードを検索しましたところ、以下のURLにあるベストアンサーのコードが近いと感じました。 http://okwave.jp/qa/q4155655.html コードの内容は以下の通りになります。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef struct node Node; struct node{ char *word; int count; Node *left,*right; }; Node *root=NULL; void compose(FILE *fp); void inorder(Node *p); void strlower(char *s); int main(int argc, char *argv[]) { FILE *fp; Node *new; fp=fopen(argv[1],"r"); if(fp==NULL){puts("ファイルを開けません");return(-1);} compose(fp); inorder(root); return (0); } void strlower(char *s){ while(*s!=NULL){*s=tolower(*s);s++;} } void compose(FILE*fp){ Node **p,*new; char buf[256]; while(1){ fscanf(fp,"%[^a-zA-Z0-9]",buf); if(fscanf(fp,"%[a-zA-Z0-9]",buf)==EOF)break; strlower(buf); if(root==NULL){ new=(Node *)malloc(sizeof(Node)); new->left=NULL; new->right=NULL; new->word=strdup(buf); new->count=1; root=new; }else{ *p=root; while(1){ if(strcmp(buf,(*p)->word)==0){ (*p)->count++;break; }else if(strcmp(buf,(*p)->word)<0){ if((*p)->left==NULL){ new=(Node *)malloc(sizeof(Node)); new->left=NULL;new->right=NULL;new->word=strdup(buf);new->count=1; (*p)->left=new; break; }else{ *p=(*p)->left; } }else{ if((*p)->right==NULL){ new=(Node *)malloc(sizeof(Node)); new->left=NULL; new->right=NULL; new->word=strdup(buf); new->count=1; (*p)->right=new; break; }else{ *p=(*p)->right; } } } } } } void inorder(Node*p){ if (p==NULL) return; inorder(p->left); printf("%s %d\n",p->word, p->count); inorder(p->right); } しかし、これをそのままコンパイル・実行すると、コンパイル時に以下の注意が出ます。 warning comparison between pointer and integer ('int' and 'char *') while(*s!=NULL){*s=tolower(*s);s++;} 上記の注意を無視してそのまま実行すると、segmatation faultが出てしまいますorz おそらく、sの型が*s=s[]なので、注意の中の「s++」の部分で誤作動を起こしている(s++を実行するにはsはint型でなければならない)と思うのですが、どうコード文を変えれば良いのかがよくわかりません。 どなたかお教え頂けると幸いです。どうぞよろしくお願いしますm(_ _)m

  • C言語の構造体参照について

    入力ファイルを読み込み、構造体に格納しています。 構造体の中の、char kumiai_kubun[1]が、'0'および'1'になっているかの参照方法を教えてください。 ファイル011100920001000001の部分の最後の数字(1)が組合区分になります。 ・入力ファイル 000000003820050507200504 011100920001000001 エス事業(協)     9999999999999999 ・プログラム #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <errno.h> void print(char* buf, int size); /* 組合情報構造体 */ typedef union kumiaiin_jyouhou { char rawdata[80]; struct hdr { char sikibetu_code[2]; char kensu[8]; char koushin_date[8]; char data_date_year[4]; char data_date_month[2]; char dummy[56]; } header; struct dat { char sikibetu_code[2]; char daicyo_bango[10]; char kumiaiin_bango[5]; char kumiai_kubun[1]; char kaisyamei[46]; char dattai_kaiyaku_ymd[8]; char sakujyo_ymd[8]; } data; } KUMIAIIN_JYOUHOU; int main(int argc, char* argv[]) { KUMIAIIN_JYOUHOU *bufp; FILE *fp; int sts, rtncd; /* 初期化 */ rtncd=0; /* 区切り文字設定 */ strncpy(fs, FS, sizeof(fs)); /* データファイルオープン */ fp = fopen(argv[1], "rb"); /* 組合員情報共用体領域読み込み用メモリの確保 */ bufp = malloc(sizeof(KUMIAIIN_JYOUHOU)); /* ファイル読込 */ while( 1 ) { /* 組合員情報読み込み */ memset(bufp, NULL, sizeof(KUMIAIIN_JYOUHOU)); sts = fread(bufp, sizeof(KUMIAIIN_JYOUHOU), 1, fp); ~組合区分の判定処理~ } fclose(fp); }