fwprintf() — データをワイド・キャラクターとしてフォーマットし、ストリームに書き込む
形式
#include <stdio.h>
#include <wchar.h>
int fwprintf(FILE *stream, const wchar_t *format, argument-list);言語レベル
ANSI
スレッド・セーフ
はい
ロケール依存
この関数の振る舞いは、LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) がコンパイル・コマンドに対して指定されている場合は、現行ロケールの LC_CTYPE および LC_NUMERIC カテゴリーの影響を受ける可能性があります。 この関数は、コンパイル・コマンドに対して LOCALETYPE(*CLD) が指定されている場合には使用できません。 詳しくは、 CCSID とロケールについてを参照してください。
統合ファイル・システム・インターフェース
この関数は、コンパイル・コマンドに対して SYSIFCOPT(*NOIFSIO) が指定されている場合には使用できません。
ワイド文字関数
詳しくは、 ワイド文字 を参照してください。
説明
fwprintf() 関数は、 formatが指すワイド・ストリングの制御下で、 streamが指すストリームに出力を書き込みます。 書式ストリングは、後続の引数が出力用にどのように変換されるかを指定します。
fwprintf() 関数は、フォーマット内の対応するワイド文字フォーマット指定子に従って、 argument-list 内の各エントリーを変換します。
書式に対して引数が不十分な場合、振る舞いは予期できません。 引数が残っている間にフォーマットが使い尽くされた場合、 fwprintf() 関数は余分な引数を評価しますが、それ以外の場合は無視します。 fwprintf() 関数は、書式制御ストリングの終わりを検出すると戻ります。
書式はゼロ以上のディレクティブで構成されています。一般にはワイド文字
(% 以外) および変換指定です。 変換指定は、書式ストリングでワイド文字ストリングにより置換されたかのように処理されます。 ワイド文字ストリングはゼロ以上の後続の引数を取り出し、該当する場合は、対応する変換指定子に応じてその引数を変換した結果です。 次に、 fwprintf() 関数は、拡張ワイド文字フォーマット・ストリングを出力ストリームに書き込みます。
fwprintf() 関数のフォーマットは、 printf()のフォーマット・ストリングと同じフォームと機能を持ちますが、以下の例外があります。- %c (l 接頭部なし) は、
btowc()関数を呼び出す場合と同様に、整数引数を wchar_t に変換します。 - %s (l 接頭部なし) は、
mbrtowc()関数を呼び出す場合と同様に、マルチバイト文字の配列を wchar_t の配列に変換します。 精度に対して、より短い出力が指定されていない限り、配列は終了 NULL 文字に達するまで (終了 NULL 文字は含まれません) 書き込まれます。 - %ls および %S は wchar_t の配列を書き込みます。 この配列は、終了ヌル文字に達するまで書き込まれます (終了ヌル文字自身は書き込まれません) 。ただし、より短い出力が精度に指定されている場合は除きます。
- %c、%s、%ls、および %S に対して指定された任意の幅すなわち精度は、バイト数ではなく、文字数を示します。
変換指定が無効な場合、その振る舞いは予期できません。
任意の引数またはポイントが和集合または集合の場合 (%s 変換を使用した char 型配列、 %ls 変換を使用した wchar_t 型配列、または %p 変換を使用したポインターを除く)、振る舞いは予期できません。
いかなる場合も、存在していないフィールド幅または短いフィールド幅で、フィールドが切り捨てられることはありません。変換結果がフィールド幅よりも広い場合、そのフィールドは変換結果を含めるように拡張されます。
戻り値
fwprintf() 関数は、伝送されたワイド文字の数を戻します。 出力エラーが発生すると、負の値を戻します。
例
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int count [10] = {1, 5, 8, 3, 0, 3, 5, 6, 8, 10};
int main(void)
{
int i,j;
FILE *stream; /* Open the stream for writing */
if (NULL == (stream = fopen("/QSYS.LIB/LIB.LIB/WCHAR.FILE/WCHAR.MBR","wb")))
perror("fopen error");
for (i=0; i < sizeof(count) / sizeof(count[0]); i++)
{
for (j = 0; j < count[i]; j++)
fwprintf(stream, L"*"); /* Print asterisk */
fwprintf(stream, L"\n"); /* Move to the next line */
}
fclose (stream);
}
/* The member WCHAR of file WCHAR will contain:
*
*****
********
***
***
*****
******
********
**********
*/
Unicode の例
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
/* This program is compile LOCALETYPE(*LOCALEUCS2) and */
/* SYSIFCOPT(*IFSIO) */
int main(void)
{
FILE *stream;
wchar_t wc = 0x0058; /* UNICODE X */
char c1 = 'c';
char *s1 = "123";
wchar_t ws[4];
setlocale(LC_ALL,
"/QSYS.LIB/EN_US.LOCALE"); /* a CCSID 37 locale */
ws[0] = 0x0041; /* UNICODE A */
ws[1] = (wchar_t)0x0042; /* UNICODE B */
ws[2] = (wchar_t)0x0043; /* UNICODE C */
ws[3] = (wchar_t)0x0000;
stream = fopen("myfile.dat", "wb+");
/* lc and ls take wide char as input and just copies then */
/* to the file. So the file would look like this */
/* after the below fwprintf statement: */
/* 0058002000200020004100420043 */
/* 0020 is UNICODE blank */
fwprintf(stream, L"%lc %ls",wc,ws);
/* c and s take multibyte as input and produce UNICODE */
/* In this case c1 and s1 are CCSID 37 characters based */
/* on the setlocale above. So the characters are */
/* converted from CCSID 37 to UNICODE and will look */
/* like this in hex after the following fwprintf */
/* statement: 0063002000200020003100320033 */
/* 0063 is a UNICODE c 0031 is a UNICODE 1 and so on */
fwprintf(stream, L"%c %s",c1,s1);
/* Now lets try width and precision. 6ls means write */
/* 6 wide characters so we will pad with 3 UNICODE */
/* blanks and %.2s means write no more then 2 wide */
/* characters. So we get an output that looks like */
/* this: 00200020002000410042004300310032 */
fwprintf(stream, L"%6ls%.2s",ws,s1);
}
関連情報
- fprintf() — フォーマット済みデータをストリームに書き込む
- printf() — フォーマット済み文字を印刷する
- vfprintf() — 引数データをストリームに印刷する
- vprintf() — 引数データを印刷する
- btowc() — 単一バイトからワイド文字へ変換する
- mbrtowc() — マルチバイト文字をワイド文字へ変換する (再始動可能)
- vfwprintf() — ワイド文字としての引数データのフォーマット設定とストリームへの書き込み
- vswprintf() — バッファーにワイド文字をフォーマットして書き込む
- wprintf() — ワイド文字としてデータをフォーマットし、出力する
- <stdarg.h>
- <wchar.h>