• ベストアンサー

ファイル操作について。

 ファイルのテキストの中の文字列はどのような型で宣言されているか、 わかる人がいたら教えてください。  例えば、fopenでFILE宣言しているstreamにおとして、streamの中から1文字を とる時にfgetcでintのiに入れますよね。この文字をprintするときに%cとやったら ここで、型がint→charに変わってちゃんと表示されるのはわかるのですけれど、SJISの日本語2バイトからなっている物ではそれぞれの情報をi[0],i[1]に格納してそれぞれをchar型に変換して連続して表示しなければならない。そうすると、intが16ビットだとすると(32ビットの時もあるらしいので)、テキストファイルでは1文字が16ビット連続で表されているはずなのに、streamから16bitずつひっぱて8bitに直してから、また、連続して表示しなければ、出力ができないんですよ。  これはテキストファイルからstramのときに1文字の1byteにまた1byteが自動的に てういているように感じるのですけれど、もし、わかる人がいたら教えてください。説明がわかりずらいですけれど。。。。

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

  • ベストアンサー
noname#11476
noname#11476
回答No.1

ファイルの中身はどんな場合でもただの1byte単位の数字の羅列にすぎません。 そこには型の情報はありません。 2byteで一文字というのは読み出して使うプログラム側で管理する必要があります。 根本的な勘違いは、fgetc の働きにあります。 fgetc はファイルから 1byte(1文字ではない)を取り出すという関数でしかありません。2byteとってることはしないと言うことです。 戻り値はintですが、この時点ではまだ「文字」として扱っているわけではありません。 int(これが2byteでも4byteでも同じで)の変数の中に1byteの数字を入れているだけです。 だから、charに型キャストするんです。このキャストで上位バイトは捨てられます。 マルチバイト文字を扱うのでしたら、fgetwcという関数があります。こちらは1文字拾ってきてくれます。 (返す値は wint_t 型になります)

Nickee
質問者

お礼

よくわかりました。fgetwcについても勉強させてもらいます。(m__m) ありがとうございました。

その他の回答 (2)

  • madman
  • ベストアンサー率24% (612/2465)
回答No.3

まず、fgetcで読み出すのは、ファイルの中に存在しているデータの1バイトのみです。 2バイト文字が入っていても、1バイトのデータしか読み出しません。 従って、出力される(ここでの場合変数i)データは1バイト分のデータのみです。出力が16bit(2バイト)であっても2バイトの情報は読み出されません。 関数仕様をもっと理解されて方がよろしいかと思います。

Nickee
質問者

お礼

 もっと勉強します。どうもありがとうございました。

  • kee
  • ベストアンサー率13% (63/457)
回答No.2

MS-DOSのOS系では通常テキストファイルの英数字文字は1文字を16進2桁で表され、それが間断なく続きます。 日本語などの漢字では英数字分2文字分を使用します。 ところが、C言語の処理系がつくられたころ、日本語は考慮されていませんでした。 (というか、外人が考案したものですから) ですので、文字をいれるのに都合の良い1Byte変数を用意したわけです。 それがおわかりのようにchar型ですね。 そこで、日本語を使用するために2Byte文字使用するわけですが、 ここで、落とし穴があります。 ** 重要 ** 使用するOSによって、2Byte文字、つまり、int型の内容が1Byte区切りで反転しているものがあるのです。 いわゆるリトルエンディアンというもので、 これはintel系のマシンで採用されています。 具体的にいうと、int型は16bitで、16進数値が2文字入ります。 そこで、1234Hというものを表現するとき、1Byte目に34H、2Byte目に12Hをセットしなくてはなりません。 ところが、文字コードの場合、1Byte目に12H、2Byte目に34Hと表現しなくてはならないのです。 まとめると、テキストをプログラムの数字変数(integer)に2byteずつセットすると、必ず1byte毎に反転してしまのです。 たぶん、それが原因の事象だと思います。 尚、intel系はリトルエンディアンといい、反転しないのをビッグエンディアンといいます。 相互に変換することをエンディアン変換といいます。 それと、intが16bitしかつかわないのは16bitパソコンの名残であり、unix系など32bitOSはintが32bit使用します。

Nickee
質問者

お礼

質問が悪かったです。聞きたいことが違っていましたけれど、知らない貴重な情報提供と協力してもらえたことに感謝します。ありがとうございました。

関連するQ&A

専門家に質問してみよう