Linux講座にようこそ。このページは「C言語プログラミング入門 - 第14章.ライブラリ関数 - 入出力ライブラリ」です。

C言語プログラミング入門

14. ライブラリ関数(6/36) - 入出力ライブラリ(5/10)

14.8 書式出力関数

ここで紹介する出力関数は、int型やdoubl型などの変数に格納されている値を書式制御文字列に従い、文字列に編集して出力します。

14.8.1 fprintf関数

fprintf関数はファイルポインタに対応したファイルに、書式制御文字列に従い編集した文字列を出力します。

【表14-1-20】 fprintf関数
形式#include <stdio.h>
int fprintf(FILE *fp, const char *format, ...);
返り値出力できた場合は出力文字数を返します。エラーが発生した場合は負の値を返します。
引数
FILE *fp
出力するファイルのファイルポインタを指定します。
const char *format
書式制御文字列を指定します。
...
編集するデータが格納されている変数を指定します。

第2引数のformat(書式制御文字列)は「%(パーセント)」で始まり、「フラグ」、「最小フィールド幅」、「精度」、「長さ修飾子」、「変換指定子」が続きます。%と変換指定子以外は省略可能です。なお、これら以外の文字は、そのまま出力します。

フラグ
フラグとして「【表14-1-21】 フラグ一覧」のものが指定できます。
最小フィールド幅
十進整数値で指定し、最小限、何文字分のフィールド幅を確保するかを指定します。
精度
「.数値」の形式で指定し、変換指定子により、次のような意味になります。
  • dやi等の整数変換の場合は、最小桁数です。
  • e、E、fの浮動小数点変換の場合は、小数点以下の桁数です。
  • g、Gの浮動小数点変換の場合は、仮数の桁数です。
  • sの文字列変換の場合は、文字列の長さの最大値です。
長さ修飾子
short型を表す「h」、longやunsigned longを表す「l」(小文字のL)及び、long double型を表す「L」を指定できます。なお、これらは数値データを出力する場合に指定します。
変換指定子
出力データをどのように編集(変換)するかを「表14-1-22 変換指定子一覧」に示す変換指定子で指定します。数値を編集する場合には、長さ修飾子と組み合わせることができます。
【表14-1-21】 フラグ一覧
フラグ意味
+常に符号(+か-)を出力します。デフォルトでは負の場合のみ出力します。
-左詰めで出力します。
00埋めで出力します。
1個の半角スペース正の数字の前に空白を出力します。
#変換指定子により、次のような意味になります。
  • o変換の場合、先頭に0を追加出力します。
  • xとX変換の場合、先頭に0x(X変換の場合は0X)を追加出力します。
  • eやf等の浮動小数点変換の場合、常に小数点を出力します。(通常は、小数点の後に数字が続く場合にのみ、小数点を出力します)
  • gとG変換の場合、末尾の0も出力します。
【表14-1-22】 変換指定子一覧
変換指定子意味
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、Xunsigned int型の値を符号なし八進数(o)、符号なし十進数(u)、符号なし十六進数(xとX)として出力します。xは英小文字で、Xは英大文字で出力します。また、精度指定があれば精度で指定した桁数は必ず出力され、変換後の値が指定された桁数に足りない場合は、左側が0で埋められます。
schar型の配列を文字列としてを出力します。配列中の文字は終端のヌル文字(`\0')の前まで出力されます。ただし、精度が指定されていると指定された文字数だけ出力します。(この場合はヌル文字は無くてもかまいません)
pvoid *型(void型のポインタ)を十六進数で出力します。

浮動小数点実数値を出力する場合の書式はfloat型もdouble型も「%f」です。fscanf系の関数の場合と異なりますので注意して下さい。

14.8.2 printf関数

printf関数は書式制御文字列に従い編集した文字列を標準出力に出力します。fprintf関数との相違は出力が標準出力に限定されていることだけです。

【表14-1-23】 printf関数
形式#include <stdio.h>
int printf(const char *format, ...);
返り値fprintf関数と同じです。
引数
const char *format
書式制御文字列を指定します。内容はfprintf関数と同じです。
...
編集するデータが格納されている変数を指定します。

14.8.3 sprintf関数

sprintf関数は書式制御文字列に従い編集した文字列を引数に指定した変数に設定します。fprintf関数との相違は出力がchar型の配列に限定されていることだけです。

【表14-1-24】 sprintf関数
形式#include <stdio.h>
int sprintf(char *str, const char *format, ...);
返り値fprintf関数と同じです。
引数
char *str
編集結果を出力する文字列を指定します。
const char *format
書式制御文字列を指定します。内容はfprintf関数と同じです。
...
編集するデータが格納されている変数を指定します。

14.8.4 例題

下記のような,(コンマ)で区切って、番号・体重・身長・血液型のデータが登録されているex14_1_6.datファイルを入力して標準出力に編集出力します。ただし、血液型は出力しませんので入力しません。

1,67,188,A
2,98,176.5,O
3,43.2,156.5,AB
4,55.5,167.5,B
5,75.7,166.5,A
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.     FILE        *fp;
  6.     char        in_file[] = "./DATA/ex14_1_6.dat";
  7.     short int   number;            /* 番号  */
  8.     float       weight;            /* 体重  */
  9.     double      height;            /* 身長  */
  10.     int         return_code = 0;
  11.  
  12.     if((fp = fopen(in_file, "r")) != NULL)
  13.     {
  14.         printf("%-4s  %-8s %-8s\n", "番号", "体重", "身長");
  15.         /*  番号、体重、身長を入力 */
  16.         while(fscanf(fp, "%hd,%f,%lf,%*s",
  17.             &number, &weight, &height) != EOF)
  18.         {
  19.             printf(" %03hd %6.1f %6.1f\n",
  20.                     number, weight, height);
  21.         }
  22.         fclose(fp);
  23.     }
  24.     else
  25.     {
  26.         printf("%sがオープン出来ませんでした。", in_file);
  27.         return_code = 1;
  28.     }
  29.  
  30.     return return_code;
  31. }
$ ./ex14_1_7.prg
番号  体重   身長
 001   67.0  188.0
 002   98.0  176.5
 003   43.2  156.5
 004   55.5  167.5
 005   75.7  166.5
16行目
fscanf関数で番号・体重・身長データを入力します。
19行目
printf関数で入力したデータを出力します。番号は3桁で0埋めです。体重と身長は小数点以下1桁までで、最小フィールド幅は6桁です。体重と身長はそれぞれ、float型とdouble型で型名は異なりますが、変換指定子は両方共「f」です。