C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

指定した値を編集してファイルに出力する

2012.08.10

fprintf関数は、引数で指定した値を書式に従い編集(変換)してファイルに出力します。

#include <stdio.h>
int fprintf(FILE *stream, const char *format, …);

*streamはfopen関数で取得した、ファイルポインタを指定します。
*format(書式)は第3引数以降で指定する値の編集形式を指定します。
第3引数以降は可変引数で、任意の引数を指定できます。ただし、*formatにより、間接的に引数の型名と個数を指定することになります。

戻り値として、正常に出力できた場合は出力した文字数が、エラーの場合は負の値を返します。

*format(書式)は%(パーセント)記号で始まり、「フラグ」、「最小フィールド幅」、「精度指定子」、「長さ指定子」、「変換指定子」が続きます。%と変換指定子以外は省略可能です。また、これら以外の文字については、そのまま出力します。

フラグは下表の文字で指定します。

フラグ 意味
+ 常に符号(+か-)を出力します。(デフォルトでは負の場合のみ出力します。)
左詰めで出力します。
0 0埋めで出力します。
1個の半角スペース 正の数字の前に空白を出力します。
# 変換指定子により、異なります。

  • o変換の場合、先頭に0を追加出力します。
  • xとX変換の場合、先頭に’0x’(X変換の場合は’0X’)を追加出力します。
  • eやf等の浮動小数点変換の場合、常に小数点を出力します。(通常は、小数点の後に数字が続く場合にのみ、小数点を出力します。)
  • gとG変換の場合、末尾の0も出力します。

最小フィールド幅は十進整数値で指定し、最小限、何文字分のフィールド幅を確保するかを指定します。

精度指定子は「.数値」の形式で指定し、変換指定子により、次のような意味になります。

  • 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
$

関連記事