C言語は大変歴史があるプログラミング言語のひとつであり,現在も継続的に改良が続けられている.
しかし,「純粋な」C言語の文法だけでは,やや力不足,不便なので,C++ではさまざまな改良が加えられている.
ここでは,C++での入出力について簡単に例示する.
C++では,画面出力やキーボード入力(さらにはファイル入出力)にたいして,ストリームという概念が導入されている.
定番,まずはC++版の Hello World プログラムのソースコードを眺めてみよう.
#include <iostream>
using namespace std;
int main(void)
{
cout << "Hello World!" << endl; // これがprintf()に相当
return 0;
}
おなじみの C 言語版 Hello World との相違点は
#include <iostream>
は,標準ストリーム入出力用のヘッダファイル(アイ・オー・ストリームと読む)で,C言語における #include <stdio.h>
に相当.cout
は,コンソール(=コマンドプロンプト画面)への出力を表す.cout
に続く <<
は,ストリーム演算子と呼ばれ,右から左へと変数や定数を流れるように出力する記号である.(streamの概念)endl
は改行(end line) の意味で,'\n'
とほぼ同じである.いろいろなストリーム出力例
#include <iostream>
#include <cstdio> // Cのstdio.hに相当するヘッダファイル,C++用
using namespace std;
int main(void)
{
// 文字列定数の出力
cout << "Hello World!" << endl;
// 整数変数
int i = 100;
cout << "i = " << i << endl;
printf("i = %d --- by printf()\n", i); // もちろんprintf()もOK.
// 実数変数
double r = 3.1415;
cout << "r = " << r << endl;
return 0;
}
このように,ストリーム出力では,出力したい変数や文字列を,順次 <<
で並べて記述すればよく,数値や文字列など型を気にせずに出力することができる.
逆に,表示桁数や表記法を細かく指定して出力するには printf
のほうが便利な場合もある.(C++の書式の指定は後述)
C++では,キーボードからの入力についても,ストリーム機能を用いて簡単に記述できる.
C言語では scanf()
を使用してきたが,C++では「ストリーム入力」を使用する.
ソースコード中では,出力とは逆向きの記号 >>
記号を用いる.
この際,書式指定は不要で,入力された文字や数値は自動的にその変数型に変換され,格納される.
ストリーム機能によるキーボード入力の例
#include <iostream>
using namespace std;
int main(void)
{
int i;
cout << "i = ? ";
cin >> i;
cout << "入力された i = " << i << endl;
double r;
cout << "r = ? ";
cin >> r;
cout << "入力された r = " << r << endl;
return 0;
}
cout
を用いたストリーム出力では,変数の型を気にすることなく画面に数値や文字列を表示できるが,有効桁など書式を制御したい場合が多い.
coutを使用した出力においても,表示する数値全体の「桁数」や,小数点以下の表示「桁数」,16進数表示など,printf
と同様,書式を指定することができる.
書式指定には,マニピュレータ機能 iomanip
で定義されている関数群
setw(), setprecision(), setfill()
を用いる.
注:以下のコード例の通り,必ずしも便利というわけでない.
printf()
を使用した方が簡潔な場合もある.
整数の書式指定例
#include <iostream>
#include <iomanip> // マニピュレータ 用
using namespace std;
int main(void)
{
int i = 100;
cout << "i = " << i << endl; // 標準では10進数
cout << "i(hex) = " << hex << i << endl; // 16進数
cout << "i(oct) = " << oct << i << endl; // 8進数
cout << "i(dec) = " << dec << i << endl; // 10進数
cout << "i = " << setw(10) << i << endl; // 出力幅を設定
cout << "i = " << setw(10) << setfill('0') << i << endl; // 出力幅と空白を埋める文字を設定
return 0;
}
実数の書式指定の例
#include <iostream>
#include <iomanip> // マニピュレータ 用
using namespace std;
int main(void)
{
double pi = 3.14159265358979;
cout << "pi = " << pi << endl;
cout << "pi = " << setw(20) << pi << endl; // 数値の表示幅を指定 "%20lf" と同じ
cout << "pi = " << setprecision(15) << pi << endl; // 小数点以下の桁数を指定 "%.15lf" と同じ
cout << "pi = " << setw(20) << setprecision(15) << pi << endl; // 両方指定 "%20.15lf" と同じ
cout << "pi(scientific) = " << scientific << setw(20) << setprecision(15) << pi << endl; // 指数形式
return 0;
}