なので、本格的な説明に移る前に文字と文字列についての説明をさせてください。
※ ここでの説明はWindowsに限定しています。処理系やOSによって違うこともありますので覚えておいてください。
●文字列
C言語の文字列に付いて復習しましょう。
まず、文字列はchar*型で復数のchar文字がつながったものです。
例えば
char str[4] = "abc";
だと
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';
と同じです。
ここで注目して欲しいのは、半角1文字は1charのサイズ=1バイトだと言う事です。
それと最後の文字列終端コード'\0'が文字列の終端として必ず必要なことです。
char str[4] = "abc";には出てきませんが、コンパイラが勝手に補完します。
ちなみに、'\0'は数値で表すと0で16進だと0x00です。
ここまでは基本的なことですね。
ここからさらに深く文字列の内部に潜り込んでみましょう。
"\n"ってご存知ですね。よく使われる改行コードです。
http://ja.wikipedia.org/wiki/%E6%94%B9% ... C%E3%83%89
この改行コードは文字列中では0x0aのコードなんですが、実はテキストしてファイルに書きだすと0x0dと0x0aの2バイトの文字コードに変化します。
これは、ファイル出力でWindowsのテキストファイルの標準的な改行コードに自動変換される仕組みが働くからです。
例えば、
abc[改行]
[EOF]
と言うテキスト書いたとします。
これをバイナリエディタで見ると
61 62 63 0D 0A ←16進
とファイルに格納されています。
では、コンソールアプリで実験してみましょう。
#include
#include
#include
#include
void hexDump(char *str)
{
int i;
// 文字列を16進ダンプ
for( i=0 ; str[i]!='\0' ; i++ ) {
printf( "%02X ", (unsigned char)str[i] );
}
printf( "\n" );
}
int main()
{
char *str="abc\n";
char buf[16];
FILE *fp;
// そのまま16進ダンプ
printf( "[元の文字コード]\n" );
hexDump(str);
// テキストとしてファイルに書き出す。
fp = fopen("abc.txt","wt");
fwrite(str,strlen(str),1,fp);
fclose(fp);
// バイナリとしてファイルから読み込む。
fp = fopen("abc.txt","rb");
memset(buf,0x00,sizeof(buf));
fread(buf,sizeof(buf),1,fp);
fclose(fp);
// ファイルのダンプ
printf( "[ファイルの文字コード(バイナリ)]\n" );
hexDump(buf);
// バイナリとしてファイルから読み込む。
fp = fopen("abc.txt","rt");
memset(buf,0x00,sizeof(buf));
fread(buf,sizeof(buf),1,fp);
fclose(fp);
// ファイルのダンプ
printf( "[ファイルの文字コード(テキスト)]\n" );
hexDump(buf);
_getch();
return 0;
}
読み方で改行コードが変化しましたよね。
ここの特性に詳しくないとシナリオなどをテキストファイル化した時に苦労しますので、ぜひ色々試して理解しておいてください。
今回の場合は、直接シナリオをプログラムに書く予定ですので0x0aとして処理します。
長くなってきたので続きます。
次回、シフトJISって何?です。