2020.12.21 QA プログラム関連
UTF8 漢字コードでテキストファイルを作れません.
ファイルは 1byte (16進数2桁, 2進数8桁) の数の列です.
fputc 関数も 1byte づつ書き込みます.
たとえば "こ" の UTF8 コードは
0xe3811a と 16進数6桁なので, 3 byte です.
したがって,
fputc(0xe3,fp);
fputc(0x81,fp);
fputc(0x8a,fp);
のように書く必要があります.
"おは" とファイル tt.txt へ書き込む完成形のプログラムは
#include <stdio.h>
int main() {
FILE *fp;
int c;
fp = fopen("tt.txt","w");
/* "お" の utf-8 code は e3818a */
fputc(0xe3,fp);
fputc(0x81,fp);
fputc(0x8a,fp);
/* "は" は e381af */
fputc(0xe3,fp);
fputc(0x81,fp);
fputc(0xaf,fp);
fclose(fp);
return(0);
}
fputc(0xe3818a,fp); としてもファイルへ 3 bytes のデータが書き出される
わけではありません.
コード表の見方:
一番左の数に一番上の数を足したものが求めるコード.
たとえば
で "A" の字は "40" 行目の "+1" 列にあるので 0x41 がコード.
"z" の字は "70" 行目の "+A" 列にあるので 0x7a がコード.
参考:
ちなみに同じような形式で画面に書き出すには
fp = fopen("tt.txt","w");
を
fp = stdout;
として, fclose(fp) の行を削除します.
stdout は stdio.h で予め定義されている標準出力(標準状態では画面)
を意味します.
もちろんたとえば fputc(0xe3,fp) を
printf("%c",0xe3); と書き直しても標準出力へ出力されます.
char s[10] の 10 は何?
char 型(1 byte)を 10 個確保.
s[0], s[1], ..., s[9] でそれぞれを読み書きできる.
asir のベクトル S = newvect(10) とほぼ同様.
初期化は 10 個全部指定してもいいし, 最初の数個のみの指定でもよい.
たとえば
char s[10]={0x41,0x42};
は s[0], s[1] のみ初期化.
確保した量より多いデータを右辺で指定してはいけない.
例:
char s[3]={0x41,0x42,0x42,0x44};
は右辺で 4bytes のデータを与えているので, だめ.
C言語で整数を扱うには?
実習で使ってるシステムでは int 型は 32 bit までの数しか扱えずさらに
${\bf Z}/m {\bf Z}$, $m=2^{32}$ での計算しかできません.
整数を扱う話題は
大学院の講義 (5/21, 5/28) で解説しています.