fprintf関数は、引数で指定した値を書式に従い編集(変換)してファイルに出力します。
#include <stdio.h>
int fprintf(FILE *stream, const char *format, …);
*streamはfopen関数で取得した、ファイルポインタを指定します。
*format(書式)は第3引数以降で指定する値の編集形式を指定します。
第3引数以降は可変引数で、任意の引数を指定できます。ただし、*formatにより、間接的に引数の型名と個数を指定することになります。
戻り値として、正常に出力できた場合は出力した文字数が、エラーの場合は負の値を返します。
*format(書式)は%(パーセント)記号で始まり、「フラグ」、「最小フィールド幅」、「精度指定子」、「長さ指定子」、「変換指定子」が続きます。%と変換指定子以外は省略可能です。また、これら以外の文字については、そのまま出力します。
フラグは下表の文字で指定します。
フラグ | 意味 |
---|---|
+ | 常に符号(+か-)を出力します。(デフォルトでは負の場合のみ出力します。) |
– | 左詰めで出力します。 |
0 | 0埋めで出力します。 |
1個の半角スペース | 正の数字の前に空白を出力します。 |
# | 変換指定子により、異なります。
|
最小フィールド幅は十進整数値で指定し、最小限、何文字分のフィールド幅を確保するかを指定します。
精度指定子は「.数値」の形式で指定し、変換指定子により、次のような意味になります。
- dやi等の整数変換の場合は、最小桁数です。
- e、E、fの浮動小数点変換の場合は、小数点以下の桁数です。
- g、Gの浮動小数点変換の場合は、仮数の桁数です。
- sの文字列変換の場合は、文字列の長さの最大値です。
長さ指定子は数値を表す変換指定子に対して指定でき、次のような意味があります。
- hはshort型を表します。
- l(小文字のL)はlong int型かunsigned long int型を表します。
- Lはlong double型を表します。
変換指定子は変換の型を指定します。変換指定子には下表のようなものがあります。
変換指定子 | 意味 |
---|---|
c | 文字として出力します。出力するデータの型はint型又は、char型です。フラグ、精度指定子及び、長さ指定子は意味を持ちません。 |
d、i | 符号つき十進整数として出力します。出力するデータの型はint型、short型、long型ですが、short型の場合は長さ指定子にhを、long型の場合はlを指定する必要があります。精度指定子を指定した場合は、指定した桁数は必ず出力されますが、変換後の値が指定された桁数に足りない場合は、左側が0で埋められます。デフォルトの精度は1です。なお、0を表示しようとした時に、明示的に精度として0が指定されていると、出力は空文字列となります。 |
e、E | 符号つき十進浮動少数点数を指数形式で出力します。出力するデータの型はdouble型又は、long double型ですが、long double型の場合は長さ指定子にLを指定する必要があります。eとEの相違は、指数を表すEが英大文字か英小文字かだけです。 |
f | 符号つき十進浮動少数点数を小数点を用いて出力します。出力するデータの型はfloat型、double型、long double型ですが、long double型の場合は長さ指定子にLを指定する必要があります。float型の場合はdouble型に変換されます。小数点の後の桁数は、精度で指定された値となりますが、精度として明示的に0が指定された場合は、小数点以下は表示されません。また、小数点を表示する際には、小数点の前に少なくとも一桁は数字が表示されます。精度が指定されていない場合には6として扱われます。 |
g、G | 符号つき十進浮動少数点数を指数形式又は、小数点を用いて出力します。上記、e、E、fとの相違は変換する値の大きさにより、出力形式が変わることです。 |
n | これまでに出力された文字数を、int型のポインタ引数が指す整数に保存します。 |
o、u、x、X | unsigned int型の値を、符号なし八進数(o)、符号なし十進数(u)、符号なし十六進数(xとX)として出力します。xは英小文字で、Xは英大文字で出力します。また、精度指定があれば精度で指定した桁数は必ず出力され、変換後の値が指定された桁数に足りない場合は、左側が0で埋められます。 |
s | char型の配列を文字列としてを出力します。配列中の文字は、終端のヌル文字(’\0’)の前まで出力されます。ただし、精度が指定されていると、指定された文字数だけ出力します。(ヌル文字は無くてもよい。) |
p | void *型(void型のポインタ)を十六進数で出力します。 |
次の例題プログラムは身長と体重を入力して、肥満度(BMI)を算出し、固定長テキストレコード形式でファイルに出力します。ちなみに、番号は3文字の整数、身長と体重及び、肥満度は7文字の十進浮動少数点数(小数点以下2位まで出力)として出力しています。
プログラム 例
#include <stdio.h> int main() { FILE *fp; int number; /* 番号 */ double weight; /* 体重 */ double height; /* 身長 */ double bmi; /* 肥満度 */ int return_code = 0; if ((fp = fopen('temp_2.txt', 'w')) != NULL) { number = 0; while(1) { printf('%03d番目の入力\n', ++number); printf('\t体重(Kg)を入力してください ==> '); scanf('%lf', &weight); if (weight == 0.0) { break; } printf('\t身長(Cm)を入力してください ==> '); scanf('%lf', &height); /* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */ bmi = weight / (height / 100.0) / (height / 100.0); /* ファイルに出力 */ fprintf(fp, '%03d%07.2f%07.2f%07.2f\n', number, weight, height, bmi); } fclose(fp); } else { printf('ファイルのオープンに失敗しました\n'); return_code = 1; } return return_code; }
例の実行結果
$ ./fprintf.exe 001番目の入力 体重(Kg)を入力してください ==> 67.5 身長(Cm)を入力してください ==> 175.5 002番目の入力 体重(Kg)を入力してください ==> 88 身長(Cm)を入力してください ==> 187.8 003番目の入力 体重(Kg)を入力してください ==> 54.3 身長(Cm)を入力してください ==> 164 004番目の入力 体重(Kg)を入力してください ==> 0 $ $ cat temp_2.txt 0010067.500175.500021.92 0020088.000187.800024.95 0030054.300164.000020.19 $