-PR-
解決
済み

ファイル操作について。

  • 暇なときにでも
  • 質問No.51593
  • 閲覧数59
  • ありがとう数5
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 79% (107/134)

 ファイルのテキストの中の文字列はどのような型で宣言されているか、
わかる人がいたら教えてください。
 例えば、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が自動的に
てういているように感じるのですけれど、もし、わかる人がいたら教えてください。説明がわかりずらいですけれど。。。。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.1

ファイルの中身はどんな場合でもただの1byte単位の数字の羅列にすぎません。
そこには型の情報はありません。
2byteで一文字というのは読み出して使うプログラム側で管理する必要があります。

根本的な勘違いは、fgetc の働きにあります。
fgetc はファイルから 1byte(1文字ではない)を取り出すという関数でしかありません。2byteとってることはしないと言うことです。

戻り値はintですが、この時点ではまだ「文字」として扱っているわけではありません。
int(これが2byteでも4byteでも同じで)の変数の中に1byteの数字を入れているだけです。
だから、charに型キャストするんです。このキャストで上位バイトは捨てられます。

マルチバイト文字を扱うのでしたら、fgetwcという関数があります。こちらは1文字拾ってきてくれます。
(返す値は wint_t 型になります)
お礼コメント
Nickee

お礼率 79% (107/134)

よくわかりました。fgetwcについても勉強させてもらいます。(m__m)
ありがとうございました。
投稿日時 - 2001-03-14 12:50:50
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.2
レベル11

ベストアンサー率 13% (63/457)

MS-DOSのOS系では通常テキストファイルの英数字文字は1文字を16進2桁で表され、それが間断なく続きます。 日本語などの漢字では英数字分2文字分を使用します。 ところが、C言語の処理系がつくられたころ、日本語は考慮されていませんでした。 (というか、外人が考案したものですから) ですので、文字をいれるのに都合の良い1Byte変数を用意したわけです。 それがおわかりのようにchar型ですね ...続きを読む
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

お礼率 79% (107/134)

質問が悪かったです。聞きたいことが違っていましたけれど、知らない貴重な情報提供と協力してもらえたことに感謝します。ありがとうございました。
投稿日時 - 2001-03-14 12:54:20


  • 回答No.3
レベル14

ベストアンサー率 24% (612/2465)

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

お礼率 79% (107/134)

 もっと勉強します。どうもありがとうございました。
投稿日時 - 2001-03-14 12:58:22
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ