「Windows API」の版間の差分
削除された内容 追加された内容
編集の要約なし |
読み取ったファイルの文章表示 |
||
1,188 行
=== ファイルの読み書き ===
==== 総論 ====
まず、Win32 API でテキストファイルなどの読み書きをする際、文字列型でTCHARなどのマルチバイト文字列を使っているので、原則的にテキストファイルの文字コードとしてUnicodeを使う。(ただし、文字列型でcharを使っている場合には、文字コードをANSIにする。なお、ウィンドウズの日本語の文字コードの Shift-JIS はANSIに含まれる。)
1,197 ⟶ 1,198行目:
Windowsアクセサリ「メモ帳」で「名前をつけて保存」を選ぶと、ダイアログボックスの下のほうに「文字コード」という項目があるので、そこで 「Unicode」 を選んで保存すればいい。
==== 読み取ったファイルの文章表示 ====
日本語の場合、ワイド文字型 wchar_t を使わないと、TextOutの困難になる。 char型でも不可能ではないが、面倒くさいので、ワイド文字型で説明する。
例として
;読み取りたいファイル
<pre>
これはテストです。
this is a test.
</pre>
としよう。
まず、このテキストファイルの文字コードを「ANSI」に設定する。「名前をつけて保存」で、「文字コード」の欄を「ANSI」にすれば良い。
いっぽう、Win32APIのプログラミングでは、まず、読み取った文字列を格納するための変数を、グローバル変数で、
<source lang=c>
wchar_t str1[100];
</source>
のように wchar_t 型の文字配列を宣言する。
グローバル変数にする理由は、ファイル読み取りの関数と、画面表示などの別の関数で、読み取り結果を共有するので、グローバル変数で宣言する必要があるからである。
そして次に、プログラム中のファイル読み取りを実行したい箇所で、
<source lang=c>
// TODO: ここにコードを挿入してください。
setlocale(LC_ALL, ""); // ロケールの設定。空白で良い。
FILE *fp;
fopen_s(&fp, "test.txt", "r");
fgetws(str1, 100, fp); // fgetsではなく fgetws
fclose(fp);
// 行末に改行文字がつくので、それを除去
wchar_t *p = wcschr(str1, '\n');
if (p) *p = '\0'; // '\n' を除去
</source>
などとして、str1 に読み取ったワイド文字を入れる。
あとは、例えば読み取った文字列を表示したいなら、単に WM_PAINT で
<source lang=c>
// TODO: HDC を使用する描画コードをここに追加してください...
TextOut(hdc, 30, 80, str1, lstrlen(str1));
</source>
のように、すれば済む。
;実行結果
座標(30,80)の位置に
:「これはテストです。」
(カギ括弧なしの状態で)と表示される。
== 参考リンク ==
|