C++の入出力とは、プログラムにデータを入力したり、プログラムの結果を画面やファイルに出力したりする処理のことです。
C++では、入出力を扱うときに「ストリーム」という考え方を使います。
ストリームとは、データの流れのようなものです。
入力では外部からプログラムへデータが流れ込み、出力ではプログラムから画面やファイルへデータが流れていきます。
C++の基本的な入出力では、主に標準入力と標準出力を使います。
標準入力はキーボードなどから値を受け取る仕組みで、標準出力は画面に結果を表示する仕組みです。
C++でよく使う標準入出力
C++では、目的に応じて複数の標準ストリームを使い分けます。
標準入力
標準入力は、キーボードなどからデータを受け取るための仕組みです。
ユーザーが入力した数値や文字列を、プログラム内の変数に読み込むときに使います。
競技プログラミングや学習用のプログラムでは、問題文で与えられた入力を読み取る場面でよく使われます。
標準出力
標準出力は、プログラムの結果を画面に表示するための仕組みです。
計算結果、メッセージ、文字列、表のような情報などを画面に出すときに使います。
C++を学び始めたときに最もよく使う出力方法です。
標準エラー出力
標準エラー出力は、エラーやデバッグ用のメッセージを出力するために使います。
通常の出力とは別の経路で出せるため、プログラムの結果とエラーメッセージを分けたいときに便利です。
実務では、ログやトラブル調査のために使われることもあります。
ログ出力
ログ出力は、処理の経過や記録を出すために使われます。
エラーほど緊急ではないものの、処理状況を確認したい場合に使われます。
標準エラー出力と同じような用途で使われることもありますが、バッファリングのされ方が異なる場合があります。
出力の基本
C++の出力では、文字列や数値を画面に表示できます。
文字を表示する
最も基本的な出力は、文字列を画面に表示することです。
たとえば、「Hello」や「計算結果は◯◯です」のようなメッセージを出力できます。
C++では、文字列だけでなく、整数、小数、変数の値なども同じように出力できます。
複数の値を続けて出力する
C++では、文字列と変数の値を組み合わせて出力できます。
たとえば、名前と年齢を表示したり、計算式と答えを並べて表示したりできます。
文章の中に変数の値を差し込むような出力ができるため、結果を分かりやすく表示できます。
改行する
出力を見やすくするためには、改行が重要です。
C++では、改行専用の仕組みや改行文字を使って、出力結果を複数行に分けられます。
通常のプログラムでは、単に改行したいだけなら改行文字を使うことが多いです。
一方で、改行と同時に出力内容をすぐに反映させたい場合は、出力バッファをフラッシュする方法もあります。
ただし、大量の出力を行う場合、毎回フラッシュすると処理が遅くなることがあります。
入力の基本
C++の入力では、ユーザーが入力した値を変数に読み込めます。
整数を入力する
整数を入力すると、プログラム内の整数型の変数に値を保存できます。
たとえば、年齢、個数、点数、配列の要素数などを読み取るときに使います。
入力された値は、その後の計算や条件分岐で利用できます。
複数の値を入力する
C++では、複数の値をまとめて入力できます。
値は半角スペースや改行で区切られていれば、順番に読み取られます。
そのため、同じ行に複数の値が並んでいても、複数行に分かれていても、基本的には同じように扱えます。
たとえば、2つの整数を読み取って足し算する、3つの点数を読み取って平均を求める、といった処理が可能です。
空白や改行の扱い
通常の入力では、空白、改行、タブなどは区切りとして扱われます。
そのため、数値や単語を入力する場合は、空白や改行を気にしすぎる必要はありません。
ただし、文章のように空白を含む文字列を読み取りたい場合は注意が必要です。
文字列の入力
C++では、文字列も入力できます。
単語として文字列を入力する
通常の文字列入力では、空白までを1つの文字列として読み取ります。
たとえば、「Apple」や「Tokyo」のような1単語の入力であれば問題ありません。
しかし、「Hello World」のように空白を含む文字列の場合、最初の単語だけが読み取られることがあります。
1行まるごと入力する
空白を含む文章を読み取りたい場合は、1行単位で入力を受け取る方法を使います。
この方法を使えば、「Taro Yamada」や「I like C++ programming.」のような空白を含む文字列も、1つの文字列として扱えます。
通常の入力と1行入力を混ぜるときの注意
C++では、数値入力のあとに1行入力を行うと、思った通りに動かないことがあります。
理由は、数値を読み取ったあとに残った改行が、次の1行入力で読み取られてしまう場合があるからです。
その結果、本来読み取りたい文章ではなく、空の行を読み取ってしまうことがあります。
この問題を避けるには、数値入力のあとに残っている改行を適切に取り除く必要があります。
特に初心者がつまずきやすいポイントなので、通常の入力と1行入力を混ぜるときは注意が必要です。
出力の整形
C++では、出力の見た目を整えることもできます。
小数点以下の桁数を指定する
小数を出力するときは、小数点以下の桁数を指定できます。
たとえば、円周率のような長い小数を「3.14」のように小数第2位まで表示したり、平均値を「90.00」のように表示したりできます。
小数点以下の桁数を指定したい場合は、有効数字の指定とは区別して考える必要があります。
特に、固定小数点表記にするかどうかによって、表示される桁の意味が変わります。
有効数字を指定する場合との違い
小数の表示では、「小数点以下の桁数」と「有効数字の桁数」は別の意味です。
小数点以下の桁数を指定すると、小数点のあとに何桁表示するかを決められます。
一方、有効数字を指定する場合は、数値全体として何桁を重要な数字として表示するかを決めます。
初心者のうちは、小数点以下の桁数をそろえたい場合は、固定小数点表記を使うと覚えておくとよいです。
幅をそろえて出力する
表のように数字や文字列を並べたい場合は、出力幅を指定できます。
幅を指定すると、短い文字列や数値の前後に空白が入り、表示位置をそろえられます。
成績表、一覧表、番号付きデータなどを表示するときに便利です。
ただし、幅指定は基本的に次に出力する1つの値にだけ効きます。
続けて複数の値をそろえたい場合は、それぞれに幅指定を行う必要があります。
0埋めで表示する
数値を固定桁で表示したい場合は、0埋めを使えます。
たとえば、月や日を「05」「09」のように2桁で表示したり、番号を「00042」のように表示したりできます。
注意点として、幅指定は一時的な設定ですが、埋める文字の指定はその後も残る場合があります。
0埋めを使ったあとに通常の空白埋めへ戻したい場合は、設定を戻す必要があります。
入力エラーの扱い
C++では、入力された内容が期待した型と合わない場合、入力に失敗します。
型が合わない入力
整数を読み取りたい場面で文字列が入力されると、入力処理は失敗します。
たとえば、数値を求めているのに「abc」のような文字が入力された場合、整数として読み取れません。
このような場合、入力ストリームは失敗状態になります。
入力が成功したか確認する
C++では、入力が成功したかどうかを条件として確認できます。
入力に成功した場合だけ処理を行い、失敗した場合にはエラーメッセージを出す、といった書き方ができます。
ユーザー入力を扱う実用的なプログラムでは、入力チェックが重要です。
入力が続く限り処理する
入力の個数が決まっていない場合は、入力できる限り処理を続ける方法があります。
これは、ファイルの終わりまで読み込む場合や、競技プログラミングで入力が終わるまで処理する問題によく使われます。
整数を読み取れる間だけ処理を続け、入力が終わると自動的にループを抜けるような形です。
よくある入力パターン
C++の学習や競技プログラミングでは、決まった入力パターンがよく登場します。
整数を1つ読み取る
最も基本的なパターンです。
人数、回数、個数、年齢、点数など、1つの整数だけを入力として受け取る場合に使います。
整数を複数読み取る
2つ以上の整数を順番に読み取るパターンです。
幅と高さ、開始値と終了値、2つの座標、複数の点数などを扱うときによく使います。
入力された順番に変数へ入るため、どの値が何を表しているのかを意識することが大切です。
最初に個数を読み取り、その後に複数の値を読む
競技プログラミングで非常によく使われる形式です。
最初にデータの個数が与えられ、その後にその個数分の数値や文字列が続きます。
配列やリストに値を保存して処理することが多いです。
二次元のデータを読み取る
表やグリッドのようなデータを扱う場合は、行数と列数を読み取り、そのあとに二次元のデータを読み取ります。
迷路、マップ、行列、画像のようなデータを処理するときによく使われます。
行と列を意識して読み取る必要があります。
文字列を1文字ずつ処理する
文字列を読み取ったあと、先頭から1文字ずつ処理することもできます。
文字の種類を数える、特定の文字を探す、文字列を変換する、回文かどうかを判定する、といった処理でよく使われます。
1行ずつ入力を読む
文章やログのようなデータを扱う場合は、1行ずつ読み取る方法が便利です。
空白を含む文章もそのまま扱えるため、通常の単語単位の入力よりも柔軟です。
テキストファイルの処理や、複数行の文章入力に向いています。
高速入出力
C++では、入出力を高速化する設定があります。
高速入出力が必要になる場面
通常の学習用プログラムでは、入出力の速度をあまり気にする必要はありません。
しかし、競技プログラミングのように大量のデータを読み書きする場面では、入出力の遅さが実行時間に影響することがあります。
そのため、標準入出力を高速化する設定がよく使われます。
Cの入出力との同期を切る
C++の標準入出力は、通常、C言語の入出力と安全に併用できるように同期されています。
この同期を切ることで、C++の入出力を高速化できます。
ただし、その場合はC++の入出力とC言語の入出力を混ぜない方が安全です。
入力前の自動フラッシュを解除する
通常、入力処理の前には出力が自動的にフラッシュされることがあります。
これは対話型のプログラムでは便利ですが、大量の入出力を行う場合には余計な処理になることがあります。
自動フラッシュを解除すると、さらに高速化が期待できます。
ただし、ユーザーに入力を促すメッセージを表示するような対話的なプログラムでは、必要に応じて手動でフラッシュする必要があります。
ファイル入出力
C++では、画面やキーボードだけでなく、ファイルに対して入出力を行うこともできます。
ファイルに書き込む
ファイル出力を使うと、プログラムの結果をテキストファイルなどに保存できます。
計算結果、ログ、レポート、設定情報などをファイルに書き出したい場合に使います。
画面に表示するだけでなく、あとから確認できる形で保存できる点が便利です。
ファイルから読み込む
ファイル入力を使うと、あらかじめ用意したファイルからデータを読み込めます。
大量のデータを毎回キーボードから入力するのは大変なので、テストデータや設定ファイルなどを読み込むときに役立ちます。
ファイルが開けたか確認する
ファイル入出力では、ファイルが必ず開けるとは限りません。
ファイル名が間違っている、ファイルが存在しない、保存先に権限がない、といった理由で失敗することがあります。
そのため、実用的なプログラムでは、ファイルが正しく開けたかどうかを確認することが大切です。
ファイルは自動的に閉じられることが多い
ファイルを扱うオブジェクトは、スコープを抜けると自動的に閉じられることが多いです。
そのため、必ず毎回明示的に閉じる必要があるわけではありません。
ただし、処理の途中で確実にファイルを閉じたい場合や、書き込み内容をすぐに反映させたい場合には、明示的に閉じることもあります。
C言語風の入出力との違い
C++では、C言語風の入出力も使えます。
C言語風の入出力
C言語では、書式指定を使って入力や出力を行います。
整数、小数、文字列などに応じて書式を指定する必要があり、細かい制御がしやすい一方で、型の指定を間違えると不具合の原因になりやすいです。
C++の入出力の特徴
C++の標準入出力では、型に応じて自動的に入力や出力が処理されます。
そのため、整数、小数、文字列などを同じような感覚で扱えます。
初心者にとっては、C言語風の入出力よりも直感的に理解しやすい場合が多いです。
混ぜて使うときの注意
C++の入出力とC言語風の入出力は、状況によっては混ぜて使えます。
しかし、高速化設定を行った場合は、両者を混ぜると出力の順番が期待通りにならないなどの問題が起こる可能性があります。
特に初心者のうちは、C++の入出力に統一する方が安全です。
よくあるミス
C++の入出力では、初心者がつまずきやすいポイントがいくつかあります。
必要なヘッダーを忘れる
C++では、使う機能に応じて必要なヘッダーを読み込む必要があります。
標準入出力を使うには入出力用のヘッダー、文字列を使うには文字列用のヘッダー、出力の整形を使うには整形用のヘッダーが必要です。
環境によっては一部のヘッダーを省略しても動くことがありますが、標準的には必要なヘッダーを明示する方が安全です。
名前空間を忘れる
C++の標準ライブラリの多くは、標準名前空間の中にあります。
そのため、標準入力や標準出力、文字列などを使う場合は、名前空間を意識する必要があります。
学習段階では名前空間をまとめて使う書き方もありますが、実務では必要に応じて明示的に書くことが多いです。
通常の入力と1行入力を混ぜて失敗する
数値入力の直後に1行入力を行うと、残った改行を読み取ってしまい、空の文字列になることがあります。
これはC++の入出力で非常によくあるミスです。
文章や名前などを1行で読み取りたい場合は、前の入力で残った改行を処理する必要があります。
小数の桁数指定を誤解する
小数の表示で、桁数指定を使ったのに思った通りにならないことがあります。
原因は、小数点以下の桁数を指定しているつもりが、実際には有効数字の桁数を指定している場合があるためです。
小数点以下をそろえたい場合は、固定小数点表記を使うことが重要です。
高速化設定後にC風の入出力と混ぜる
高速化設定を行ったあとに、C++の入出力とC言語風の入出力を混ぜると、予期しない動作につながることがあります。
競技プログラミングでは高速化設定を使うことが多いですが、その場合は基本的にC++の入出力に統一するのが安全です。
初心者がまず覚えるべきポイント
C++の入出力を学び始めたら、最初に押さえるべきことは多くありません。
入力は変数に値を入れる処理
入力は、外部から受け取ったデータをプログラム内の変数に保存する処理です。
整数、小数、文字列など、受け取りたいデータの種類に応じて変数を用意し、入力された値をそこに入れます。
出力は値を画面に表示する処理
出力は、文字列や変数の値を画面に表示する処理です。
計算結果や処理のメッセージを表示することで、プログラムが何を行ったのかを確認できます。
空白区切りと1行入力を使い分ける
単語や数値を読み取りたい場合は、空白区切りの入力で十分です。
一方、空白を含む文章や名前を読み取りたい場合は、1行入力を使う必要があります。
この使い分けができるようになると、入力処理でつまずきにくくなります。
小数や表の出力は整形機能を使う
小数点以下の桁数をそろえたり、数字の幅をそろえたりしたい場合は、出力の整形機能を使います。
見た目を整えることで、プログラムの結果が読みやすくなります。
特に表形式の出力や、金額、平均値、割合などを表示する場合に便利です。
C++の入出力を理解するコツ
C++の入出力は、最初は記号が多く見えて難しく感じるかもしれません。
しかし、考え方としてはとてもシンプルです。
入力は「外から値を受け取ること」、出力は「外へ値を表示すること」です。
入力と出力の流れを意識する
C++では、データがどこからどこへ流れているのかを意識すると理解しやすくなります。
入力では、キーボードやファイルからプログラムへデータが流れます。
出力では、プログラムから画面やファイルへデータが流れます。
空白区切りの入力を基本にする
最初は、空白区切りの入力を基本として覚えるとよいです。
整数や単語を読み取るだけなら、空白や改行で区切られていれば順番に読み取れます。
多くの基本問題は、この考え方で対応できます。
文章を扱うときだけ1行入力を使う
空白を含む文章を扱う場合は、1行入力を使います。
ただし、通常の入力と1行入力を混ぜるときは、改行が残る問題に注意が必要です。
この点を理解しておくと、文字列入力でのミスをかなり減らせます。
まとめ
C++の入出力では、標準入力、標準出力、標準エラー出力などのストリームを使って、データの読み書きを行います。
基本的な入力では、キーボードなどから値を受け取り、変数に保存します。
基本的な出力では、文字列や変数の値を画面に表示します。
空白区切りの入力であれば、数値や単語を簡単に読み取れます。
一方、空白を含む文章を読み取りたい場合は、1行単位の入力を使う必要があります。
また、小数点以下の桁数をそろえる、表示幅をそろえる、0埋めするなど、出力の見た目を整える機能も用意されています。
競技プログラミングなどで大量の入出力を扱う場合は、高速化設定も重要です。
ただし、高速化設定を使った場合は、C++の入出力とC言語風の入出力を混ぜないように注意する必要があります。
C++の入出力で特に重要なのは、次の考え方です。
入力は、外部から値を受け取って変数に入れる処理です。
出力は、プログラムの結果を画面やファイルに表示する処理です。
空白区切りの入力と1行入力を使い分け、小数や表の出力では整形機能を使うと、C++の入出力をより正確に扱えるようになります。
以上、C++の入出力についてでした。
最後までお読みいただき、ありがとうございました。
