(0)
(1) テキストファイルを配列変数に読み込むと、どんな結果になるのか?
- ここではC言語の文字列の扱いに自信がない人のために、基礎的な説明をします。
- C言語は文字列型という型を基本型としては持っていません。文字列は「文字コード」という整数の数の集まりだと考えて、配列変数に格納します。
- とまあ結局はそれだけのことなのですが、それでもたぶんピンとこないと思うので、もう少し詳しく説明します。
(2) 文字コード
- ここでは話を単純にするために、半角文字に限って説明します。
- コンピュータは原則として、ONとOFFの2つの状態しか扱えないのですが、それだと豆電球をつけたり消したりするくらいのことしかできません。それだと当然ながらつまらないわけです。
- そこで、ONを1、OFFを0に見立てて、ON/OFFの並びが二進数の桁を表しているというルールを決め、それで整数を表すということにしました。
- つまりコンピュータは相変わらずONとOFFしか処理していないのですが、それは人間にとっては数値の記憶だったり、加算だったり除算だったりと、別の意味を持たせることができたのです。
- コンピュータは数値を理解しているわけではありません。ただ8個や16個、あるいは32個や64個のON/OFFの集まりをいくつか受け取って、「このパターンが来たらこのパターンを返す」っていうのを淡々とやっているだけです。・・・人間の方が、それを見て、銀行の預金残高が減った増えたと一喜一憂したり、ゲームのハイスコアを更新できたと喜んでみたり、まあそういうことをしているだけです。
- ちょっと話が脱線してしまいましたが、つまり「整数をON/OFFの組み合わせだけでどう表すか」を決めたから、コンピュータは整数を扱えるようになったのです。
- では、文字はどうでしょうか。はい、文字に番号を付けることにしました。そうすれば文字は数値になり、数値になればON/OFFになるので、コンピュータで扱えるようになるのです。つまりコンピュータで文字を扱うために文字に番号を付けたのです。・・・これを文字コードと言います。
- 大文字アルファベット
| A | B | C | D | E | F | ... | V | W | X | Y | Z | | 65 | 66 | 67 | 68 | 69 | 70 | | 86 | 87 | 88 | 89 | 90 |
- 小文字アルファベット
| a | b | c | d | e | f | ... | v | w | x | y | z | | 97 | 98 | 99 | 100 | 101 | 102 | | 118 | 119 | 120 | 121 | 122 |
- 数字や記号(1という文字の文字コードは1ではないのが面白いところ)
| 0 | 1 | 2 | 3 | ... | 7 | 8 | 9 | , | . | : | ; | | 48 | 49 | 50 | 51 | | 55 | 56 | 57 | 44 | 46 | 58 | 59 |
- まあ全部書けば書けるのですが、長くなるし、別に暗記する必要はないので、このくらいにしておきます。
- なぜ暗記しなくていいのかというと、C言語では文字コードを教えてくれる書き方があるのです。それは 'A' とか 'z' みたいに、文字をシングルクォテーションでくくることです。
- 'A'は65という数値の代わりで、'z'は122の代わりです。文字ではありません。ただの数値です。整数です。そもそもC言語に文字型なんてないのです。
- 文字コードを覚えなくていいなんて、とても便利ですね!
- 念を押しますが、文字コードは文字ではなくただの数値です。printf("%d", 1 + 2 * 3);みたいに書けば簡単に計算して結果を画面に書くことができますが、これと同様にprintf("%d", 'A' + 'z');みたいなことができます。何が表示されると思いますか?「Az」とかじゃないですよ、正解は「187」です、65+122=187だからです。
- 他の言語では異なる挙動をするかもしれませんが、C言語はこういう言語なのです。
(3) テキストファイルを読み込んだ場合
- txt[0]~txt[9]:
| txt[0] | txt[1] | txt[2] | txt[3] | txt[4] | txt[5] | txt[6] | txt[7] | txt[8] | txt[9] | | 97 | 61 | 49 | 59 | 10 | 98 | 61 | 50 | 59 | 10 | | 'a' | '=' | '1' | ';' | 改行 | 'b' | '=' | '2' | ';' | 改行 |
- txt[10]~txt[19]:
| txt[10] | txt[11] | txt[12] | txt[13] | txt[14] | txt[15] | txt[16] | txt[17] | txt[18] | txt[19] | | 99 | 61 | 97 | 43 | 98 | 59 | 10 | 112 | 114 | 105 | | 'c' | '=' | 'a' | '+' | 'b' | ';' | 改行 | 'p' | 'r' | 'i' |
- txt[20]~
| txt[20] | txt[21] | txt[22] | txt[23] | txt[24] | txt[25] | txt[26] | | 110 | 116 | 32 | 99 | 59 | 10 | 0 | | 'n' | 't' | ' ' | 'c' | ';' | 改行 | |
- txt[]に具体的にどんな数値が入るかわかったでしょうか。ここで注目してほしいポイントはいくつかあります。
- 改行の文字コードは10。改行もただの1文字で、文字コードはその後も連続して並んでいる。
- スペース(空白文字)の文字コードは32。
- 末尾は0がある。・・・これはloadText()が「ここでファイルが終わっていますよ」という印のためにつけているものです。テキストファイル内にはこの情報はありません。
(4) その他のささいなこと
- プログラム内では、'¥n'という表記が出てきますが、これは改行の文字コードを表していて、つまり10です。10なら10って書いたほうがいいような気もしますが、改行の文字コードは10って暗記できていない人がこれを見ると「???」ってなることがあるので、'¥n'って書いてあげるほうが良いとされています。・・・まあ単なる好みの問題ですね。
- 同じくプログラム内では'¥t'という表記も出てきます。これはタブの文字コードを表しています。これは9です。だから9って書いたほうがいいような気がしますが、まあ改行の時と同じで、'¥t'って書くほうが普通です。
- '¥r'という表記も出てきます。コードの値は13です。これは改行コードの前後に付随することがある特別な文字コードです。たとえばWindowsの場合は、'¥n'の直前に'¥r'がおかれます。・・・この特殊なコードは基本的に無視してかまわないです。そもそもWindowsで作ったテキストファイルを"rt"モードでfopenしたら'¥r'の文字コードは出てきません。Linuxで作ったテキストファイルなら、そもそもファイル内に'¥r'の文字コードは存在しません。だから多くの場合で、'¥r'の存在そのものを忘れてしまっても問題ないくらいです。
- しかし、Windowsで作ったテキストファイルをLinuxで開く場合などは、'¥r'が出てきて誤動作することがあります。こうなるとなかなか原因に気づけなくて「???」になるので、私は習慣的に'¥r'も明示的に処理するようにしています。
こめんと欄
|