日本語が書かれたファイルから、その日本語をEUCコードとして配列に収めたいのですが、どうすればいいのでしょう?

英字だったらchar型の配列に入れてしまえばいいですが、char型って1バイトの入れ物ですよね。日本語は2バイト...
int型に入れちゃっていいんでしょうか?…でも、今度はその配列に収めた日本語を表示するトキはどうしたらいいんでしょ??書式は%cでいいのですかね…?(EUCコードで表示するときと、他のコードで表示するトキはどうやって区別するんだろ?というのも疑問です。)

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

char型でOKですよ。

(^_^)
但し2バイト文字はその名の通り一文字で2バイト(char型二つ分)使いますので配列を用意するときには注意が必要です。(例えば全角10文字格納するには最低char型で21個以上の配列が必要。1個は'\0'のため。)
表示の際も%sで大丈夫です。(入力もscanf等なら%s)
但し、実行環境が日本語の入出力をサポートしている必要があります。
文字コードに関しては同じ実行環境で入力・出力共に行うのであれば意識しなくても大丈夫です。

この回答への補足

※お礼の欄の後記

問題解決しました。 たしかにchar型でよかったです。
まだ全ての疑問がカンペキに解決したわけではないですが、
今はまだ勉強不足というコトで、とりあえず今回はこれにて閉じさせてもらいます。

補足日時:2001/10/03 18:28
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

…すみません。ただいま混乱中です。
その混乱を解消するために、もう一つ質問を立ち上げますが、
全ての疑問が解消されたときにこの質問も閉めさせてもらう予定です。

お礼日時:2001/10/02 19:26

まず、元のファイルの文字コードが問題になりますが、


EUCコード以外のファイルなら、変換が必要になります。


また、日本語は2バイトとは限りません。
半角カナとか1バイトカナとか呼ばれる文字は,
日本語EUCでは3バイトになったはずです。

配列はint型に入れることも可能でしょうが,
charとして読んだほうが通常は楽と思います。
勿論,目的や処理内容によってはintが適切なケースもありえるでしょう。

表示も環境によります。
もともとEUCが表示できる環境ならEUCでOKですが、
例えばWindows環境ならShift JISに変換する必要があります。

この回答への補足

※お礼の欄の後記

今回は一応問題解決しました。
まだ全ての疑問がカンペキに解決したわけではないですが、
今はまだ勉強不足というコトで、とりあえず今回はこれにて閉じさせてもらいます。

補足日時:2001/10/03 18:38
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

…すみません。ただいま混乱中です。
その混乱を解消するために、もう一つ質問を立ち上げますが、
全ての疑問が解消されたときにこの質問も閉めさせてもらう予定です。

お礼日時:2001/10/02 19:27

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

Qchar型+char型ってint型? if(char型==int型)?

C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。

char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。
(下のプログラムの
printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */
という部分の結果は4なので、int型と考えるべきなのかな。)

私は、char型とint型の加算の結果はint型だと思っていましたが、
char型とchar型の加算の結果はやはりchar型だと思っていました。
(それが間違えているのでしょうか。)


if(a[0]==i) /* char型とint型の比較(?) */
の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。
(私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。)
左辺はchar型のように見えて、じつはint型ですか。


#include <stdio.h>
int main(void)
{
char a[4];
int i=77;
printf("sizeof(int)は%d\n", sizeof(int));
printf("sizeof(char)は%d\n", sizeof(char));
printf("sizeof('M')は%d\n", sizeof('M'));
printf("sizeof(a[0])は%d\n", sizeof(a[0]));

a[0]='M';
a[1]=7+6;
a[2]=a[0]+a[1];
printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */
printf("sizeof(+a[0])=%d\n", sizeof(+a[0]));

if(a[0]==i) /* char型とint型の比較(?) */
puts("a[0]==i");
else
puts("a[0]!=i");

return(0);
}

ちなみにワーニングもエラーもなんにもでません。

C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。

char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。
(下のプログラムの
printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */
という部分の結果は4なので、int型と考えるべきなのかな。)

私は、char型とint型の加算の結果はint型だと思っていましたが、
char型とchar型の加算の結果はやはりchar型だと思っていました。
(それが間違えているのでしょう...続きを読む

Aベストアンサー

「sizeof 単項式」について補足です。

これは sizeof 演算子が「単項演算子」であるために書かれたものだと思われます。
例えば同様に単項演算子である ++ も、「++ 単項式」です。

では単項式とは何なのかというと、これは以下のようなものを指します。(抜けがあるかもしれませんが。)
・定数
・名前(変数名や関数名など)
・( 式 )
・後置式

( 式 ) はおなじみの「式の結果を返す」ものですが、実はこれ全体で単項式です。
本来「sizeof 単項式」では ( ) を必要としないので、sizeof より優先順位の低い演算子を含む式を裸で渡すことはませんが、( ) で囲めばどんな式でも書けるわけです。

後置式は「配列構文によるアドレス参照式」や「関数呼び出し式」、「メンバ参照式」「後置型インクリメント/デクリメント式」です。
なので、
> sizeof(a[0])
> と書いたら、[ ] という演算子は2項演算子だから、a[0]は単項式になっていない
は、わざわざ ( ) で囲まず sizeof a[0] と書いても、正しい単項式なので問題ありません。
(これらの演算子は、全て sizeof より優先順位が上になっています。)

先に ++ も単項式を取る、ということを書きましたが、++ だって
  ++*(p + n)
のような記述が通るのだから、sizeof でも問題がなくて当然です。

また、例えば ++ では「オペランドは左辺値でなければならない」という原則があり、左辺値でない式に ++ を適用するとコンパイルエラーが発生します。
しかし、sizeof に「オペランドはオブジェクトでなければならない」などという原則を聞いたことがありません。
無論コンパイルエラーも起きませんし、期待通りに式の値のサイズが返ります。
「式の値のサイズ」というのはコンパイル時に判明しているものなので、取得できて当然といえば当然ですが、これがCで定められた仕様かどうかというのは残念ながら見つけることはできませんでした。
ただし、質問にあるような sizeof の文法は全て正しく、警告が出ないのは仕様通りだというのは間違いありません。

「sizeof 単項式」について補足です。

これは sizeof 演算子が「単項演算子」であるために書かれたものだと思われます。
例えば同様に単項演算子である ++ も、「++ 単項式」です。

では単項式とは何なのかというと、これは以下のようなものを指します。(抜けがあるかもしれませんが。)
・定数
・名前(変数名や関数名など)
・( 式 )
・後置式

( 式 ) はおなじみの「式の結果を返す」ものですが、実はこれ全体で単項式です。
本来「sizeof 単項式」では ( ) を必要としないので、sizeof より優...続きを読む

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

Qint型にchar型が代入されたときの処理について

初歩的な質問かとは思いますがどうぞよろしくお願いいたしますm(__)m

何のプログラムかというとファイルに名前、年齢、職業、メールアドレス、パスワードを書き込むプログラムをC言語で作成をおこないました。
仕様としてはあらかじめ入力しておいてそこに一部変更するときに用いるものとして設計しました。
別のところで登録してから変更時にこのプログラムを使う予定ですが今回は予め値を代入しています。
一部変更ということで変更箇所を選択して変更するためswith文を用い、変更箇所が2箇所以上ある場合でも大丈夫なように設定終了を選択するまでdo while文でループさせようとした結果、下記のようなプログラムになりました

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

int main() {
FILE *outputfile; // 出力ストリーム

outputfile = fopen("/home/meibo.txt", "w"); // ファイルを書き込み用にオープン(開く)
if (outputfile == NULL) { // オープンに失敗した場合
printf("cannot open\n"); // エラーメッセージを出して
exit(1); // 異常終了
}

char name[100] = "山田太郎";
int toshi = 24;
int jobnum = 1;
//char job[10] = "学生";
char mail[100] = "yamada@gmail.com";
char pass[100] = "yamada";
int ok = 0;
int config;
//ファイル書き込み
fprintf(outputfile, "%s\n", name);
fprintf(outputfile, "%d\n", toshi);
if (jobnum == 1) {
fprintf(outputfile, "学生\n");
} else if (jobnum == 2) {
fprintf(outputfile, "社会人\n");
} else {
fprintf(outputfile, "その他\n");
}
fprintf(outputfile, "%s\n", mail);
fprintf(outputfile, "%s\n", pass);

do {
printf("変更したい設定を選択してください\n");
printf("名前:1\n");
printf("年齢:2\n");
printf("仕事:3\n");
printf("メールアドレス:4\n");
printf("パスワード:5\n");
printf("設定終了:6\n");
scanf("%d", &config);

switch (config) {
case 1:
printf("名前を入力選択してください\n");
scanf("%s", name);
break;
case 2:
printf("年齢を入力してください\n");
scanf("%d", &toshi);
break;
case 3:
while (1) {
printf("仕事を選択してください\n");
printf("学生:1 社会人:2 その他:3\n");
scanf("%d", &jobnum);
if ("jobnum==1||jobnum==2||jobnum==3") {
break;
} else {
printf("正しい数字を入力してください");
}
}
break;
case 4:
printf("メールアドレスを入力してください\n");
scanf("%s", mail);
break;
case 5:
printf("パスワードを入力してください\n");
scanf("%s", pass);
break;
case 6:
   fprintf(outputfile, "%s\n", name);
    fprintf(outputfile, "%d\n", toshi);
   if (jobnum == 1) {
  fprintf(outputfile, "学生\n");
    } else if (jobnum == 2) {
  fprintf(outputfile, "社会人\n");
   } else {
   fprintf(outputfile, "その他\n");    
}
    fprintf(outputfile, "%s\n", mail);
    fprintf(outputfile, "%s\n", pass);    
fclose(outputfile); // ファイルをクローズ(閉じる)
ok = 1;
break;
default:
printf("番号を正しく選択してください\n");
break;
}
} while (ok != 1);
//確認のため出力
printf("名前:%s\n", name);
printf("年齢:%d\n", toshi);
if (jobnum == 1) {
printf("仕事:学生\n");
} else if (jobnum == 2) {
printf("仕事:社会人\n");
} else {
printf("仕事:その他\n");
}
printf("メールアドレス:%s\n", mail);
printf("パスワード:%s\n", pass);
return 0;
}

C言語を初めて日が浅くエラーをなくすことで精一杯で結構長くなってしまいました。これでも一応
エラー自体は無く普通に数字を選択すれば動作するのですが問題は例外処理についてです。
while文を用いたcase3のjobnumや全体のwhile文のconfigはint型なので数字なら違った場合でも例外処理としてループしてくれるのですが文字列が入力されると無限ループが発生します。case2のtoshiについても文字列をいれると無限ループします。
いろいろ試しては見たのですがうまく行かず手詰まりです。
int型に文字列をいれているのが原因だとは重々承知の上でお聞きしたいです。
何かよい解決法はないでしょうか?

この質問とは趣旨が違いますがまだC言語をあまり深く理解できていないためポインタを全く使用せずに書いています。
もしよろしければポインタ使ったほうがいい場所があれば教えていただけたら嬉しいです。

初歩的な質問かとは思いますがどうぞよろしくお願いいたしますm(__)m

何のプログラムかというとファイルに名前、年齢、職業、メールアドレス、パスワードを書き込むプログラムをC言語で作成をおこないました。
仕様としてはあらかじめ入力しておいてそこに一部変更するときに用いるものとして設計しました。
別のところで登録してから変更時にこのプログラムを使う予定ですが今回は予め値を代入しています。
一部変更ということで変更箇所を選択して変更するためswith文を用い、変更箇所が2箇所以上ある場...続きを読む

Aベストアンサー

まぁ、よくあるパターンですな。
初心者がハマるポイントにちゃんとハマっているので心配ありません。

scanf("%d", ほにゃらら)
で、数字以外を入力するとエラー数値にできないのでバッファに残ります。
で、バッファに残ってるデータは次のscanf()等で処理することになります。
戻り値を確認して、よろしくエラー処理して下さい。

>if ("jobnum==1||jobnum==2||jobnum==3") {

ここは直前のscanfa)で何を入力しても真になります。
つまりelseには流れません。
500を入力しようとも…です。
この条件判定は『メモリ上のどこかにある"jobnum==1||jobnum==2||jobnum==3"という文字列の先頭アドレスが0以外か?』という判定です。
文字列定数がアドレス0x00000000に配置される。ということはまずないので、常に真です。

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

Qchar型配列をString型にしたい

 VC++2005ExpressEdition + PlatformSDKを使用しています.

 char型配列をString型にしたいと思っています(MessageBoxで表示するため).

 int型ならば,
> String^ out = String::Format("{0}", i );
> MessageBox::Show(out);
などとできます.

 下のアドレス(*1)のNo.2の答えにあるように
> char ss[256];
> String^ out;
> out=ss;
とすると
> error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。
なるエラーが出ます(S を大文字にしたりハットを付けたりしています).

 char型の配列のString型への変換はどのようにすればいいのでしょうか.

(*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640

Aベストアンサー

試してないですが、
String^ out = gcnew String(ss);
でいけませんか

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

QString型をchar型配列にしたい

 VC++2005ExpressEdition + PlatformSDKを使用しています.

 String型をchar型配列に変換したいと思っています.

 自分なりに調べてみたのですが,

> String^ str = gcnew String("test");
> char chr[5];
> chr = str->ToCharArray();

などとしても次のようなエラーが出ます.

> error C2440: '=' : 'cli::array<Type,dimension> ^' から 'char [5]' に変換できません。

 String型からchar型配列への変換はどのようにすればいいのでしょうか.

Aベストアンサー

>gethostbyname でアドレスを返したい
Dns::GetHostByName スタティックメソッドを使えば良いです。
http://msdn2.microsoft.com/ja-jp/library/system.net.dns.gethostbyname.aspx

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

Q日本語データを配列に収める方法

日本語(漢字含む)が書かれたファイルから、データを配列に収めるにはどうしたらいいのでしょうか?(長々とかかれていますがこれが主題です。後は読まずにこの文章に対してだけ答えてくださっても結構です。)


◆fgetc()で1文字ずつchar型の配列に収めていったのですが、その配列の内容を表示してみると、カタカナと「、」からなる意味不明の文字列が表示されてしまいました。表示は、%sで表示する方法と、%cで1文字ずつをループをつかって表示する方法の2通りの方法を試してみましたが、どっちもダメでした。なぜなんでしょうか???(ちなみに英字ならうまくいくのですが…)

ない頭を使って考えてみたんですが、漢字のバイト数を2バイトと仮定すると、(そうではないものもあるらしいのですが…)char型の配列の要素1個あたり1バイトなので、要素1個には、漢字の情報の半分の情報量しか含まれていないからではないか、とおもったんですが、どうでしょうか?

◆しかし、fgetc()ではなく、fgets()で収めてみると、なぜかうまく表示されます(この場合、1行分だけですが)。前出の2つの方法の両方で。なぜなのでしょうか??????????
じゃあ、その方法でヤレバいいじゃん、といわれそうですがしかし、fgets()だと1行分配列に収めた後、さらに同じ配列にデータの続きを収めることができないからです。つまり、ファイルから1行分しか配列に収められないと…まぁ、何か方法はあると思いますが、いずれにしろスマートではなくなるのでは、と思うのです。

長くなってしまって、ごめんなさい。文章が下手で…(汗汗)
どこか1部分に対する回答や、アドバイスでも結構ですので、よろしくお願いします。

日本語(漢字含む)が書かれたファイルから、データを配列に収めるにはどうしたらいいのでしょうか?(長々とかかれていますがこれが主題です。後は読まずにこの文章に対してだけ答えてくださっても結構です。)


◆fgetc()で1文字ずつchar型の配列に収めていったのですが、その配列の内容を表示してみると、カタカナと「、」からなる意味不明の文字列が表示されてしまいました。表示は、%sで表示する方法と、%cで1文字ずつをループをつかって表示する方法の2通りの方法を試してみましたが、どっちもダメでした。な...続きを読む

Aベストアンサー

>…あっ、そうか!このdata[0]に格納されている2進数値列を%cで出力しようとしても、対応するcharacterが無いから何も表示されない、というコトなんですかね???

そういう考えでだいたいいいと思います。
正確には,漢字の半分のデータしかないので
何を出していいか分からない状態なので、
何も出ないという状態だと思います。

3byteの方も同様です。
例えば,「亜」をShift JISで表示するためには,
0x88 0x9fを送る必要がありますが、空白がはいると
0x88 0x20 0x9fが送られます。
0x88 0x20が漢字と解釈されますが、該当する文字は
ありませんので、多分空白となるでしょう。
0x9fは半分なので表示できない・・となると思います。

ただ、こういう未定義のコードを出した場合どうなるかは、
場合によって違うかも知れません。
未定義ですから。


人気Q&Aランキング

おすすめ情報