ストリームの仕組みを知る
今まで作成してきたプログラムの中には、画面に文字や数値を出力したり、キーボードから情報を入力する処理をするものがありました。入出力は、画面やキーボード、それにファイルに対して行われます。これらの装置は一見異なるものですが、C言語では、様々な装置に対する入出力を統一的な方法で扱うことができるようになっています。この入出力機能を支える概念を、ストリーム(stream)といいます。
ストリームは、様々な異なる装置を、同じように扱うための抽象的な仕組みです。この章で、様々な入出力を行うプログラムを作成していくことにしましょう。
書式つきの入出力を行う
さて、C言語の標準ライブラリ関数には、入出力を行うための関数が数多く添付されています。これまでに使ってきたprintf()関数やscanf()関数も、この関数のうちのひとつです。これらの標準的な入出力関数はstdio.hというファイルをインクルードすることで使えるようになっています。この章ではまず、printf()関数とscanf()関数を使ったコードを復習することから始めましょう。
printf()関数は標準出力(画面)に文字列を出力する関数でした。また、scanf()関数は標準入力(キーボード)からの入力を変数などに読み込む関数であったことを思い出してください。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i;
double d;
char str[100];
printf("整数値を入力してください。\n");
scanf("%d", &i);
printf("小数値を入力してください。\n");
scanf("%lf", &d);
printf("文字列を入力してください。\n");
scanf("%s", str);
printf("入力した整数値は%dです。\n",i);
printf("入力した小数値は%lfです。\n",d);
printf("入力した文字列は%sです。\n",str);
return 0;
}
出力結果:
整数値を入力してください。
5
小数値を入力してください。
2.6
文字列を入力してください。
hello
入力した整数値は5です。
入力した小数値は2.600000です。
入力した文字列はhelloです。
この2つの関数は、標準出力・標準入力に対して、一定の書式をつけて入出力を行う関数です。変換仕様を使って、2番目以降の引数をどのような書式で入出力するのか指定することになっています。
printf()関数の変換仕様 | 内容 |
---|---|
%c | 文字で出力する |
%d | 10進数で出力する |
%f | 浮動小数点数で出力する |
%e | 科学表記法で指数部(e)をつけて出力する |
%E | 科学表記法で指数部(E)をつけて出力する |
%s | 文字列で出力する |
%p | ポインタで出力する |
%o | 8進数で表記する |
%x | 16進数(小文字)で出力する |
%X | 16進数(大文字)で出力する |
%u | 符号なしの10進数で出力する |
scanf()関数の変換仕様 | 内容 |
---|---|
%c | 文字で入力する |
%d | 10進数で入力する |
%f | 浮動小数点数(float型)で入力する |
%lf | 浮動小数点数(double型)で入力する |
%s | 文字列で入力する |
%p | ポインタで入力する |
%o | 8進数で入力する |
%x | 16進数で入力する |
%u | 符号なしの10進数で入力する |
科学表記法
N*10^nという数値の表記方法を、科学表記法(scientific notation)といいます。円周率の場合であれば、314*10^-2や31.4*10^-1となります。C言語では科学表記法を「仮数E符号 指数」という形式で表します。つまり、円周率であれば、314E-2や31.4e-1と表すわけです。Eをeとしてもかまいません。
出力幅を指定する
まず最初に、出力幅を指定する変換仕様を使ってみることにします。出力する文字や数値などの間隔を指定することができます。下のコードを入力してみてください。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i;
for (i=1;i<=10;i++)
{
printf("%3d",i); //10進数の整数を3字幅で出力する
}
printf("\n");
return 0;
}
出力結果:
1 2 3 4 5 6 7 8 9 10
printf(“%-3d”,i); 左寄せで出力します
出力結果:
1 2 3 4 5 6 7 8 9 10
重要
出力幅を指定するには、変換仕様に数値を指定する。
出力位置を指定するには、変換仕様に+また-を指定する。
精度を指定する
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double num;
printf("小数を入力してください。\n");
scanf("%lf",&num);
printf("小数点以下3桁で出力すると%.3fです。\n",num);
return 0;
}
出力結果:
小数を入力してください。
3.141592
小数点以下3桁で出力すると3.142です。
重要
精度を指定するには、.(ピリオド)のあとに、数値を指定する。
変換仕様を組み合わせる
ここまで紹介した変換仕様を組み合わせて、複雑な書式指定をすることもできます。次の指定は、「浮動小数点数を左寄せにして6文字幅・小数点以下を2桁で出力する」と言う指定ですです。
printf("円周率は%-6.2fです。\n",num);
出力結果:
円周率は3.14 です。
ここで、出力幅などの書式を指定する構文をまとめておきましょう。
構文
出力書式の指定
%±出力幅.精度 書式
10進数以外で出力する
最後に、8進数、16進数での出力方法を覚えておくことにしましょう。変換仕様を使うと、10進数以外の表記で数値を出力することもできます。次のコードは、10進数以外の表記で数値を出力するものです。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)()
{
printf("10を10進数で表記すると%dです。\n",10); // 10進数で出力する
printf("10を8進数で表記すると%oです。\n", 10); // 8進数で出力する
printf("12を進数で表記すると%oです。\n", 12); // 8進数で出力する
printf("10を16進数で表記すると%xです。\n", 10); // 16進数で出力する
return 0;
}
出力結果:
10を10進数で表記すると10です。
10を8進数で表記すると12です。
12を進数で表記すると14です。
10を16進数で表記するとaです。
これまでに最もよく使ってきた%dという変換仕様は、10進数として整数を出力する指定です。このほか8進数として出力したい場合には%o、16進数として出力したい場合には%xを使うことができるようになっています。8進数や16進数の意味については、第二章を復習してください。
重要
8進数として出力するには、変換仕様として%oを使う。
16進数として出力するには、変換仕様として%xを使う。
コメント