cin と cout を使った入出力
ここまでで、
std::coutとstd::cinの動作を確認したと思います。このレッスンでは、C++ の入出力について詳しく掘り下げていきます。なぜなら、見やすく整えられた出力を生成し、ユーザーからの入力を正しく処理することは、不可欠なスキルだからです。
1. cout を使った書式付き出力
この控えめなstd::coutは、単にテキストを印刷するだけにとどまらず、さらに多くのことができる。
(1) 1.1 エスケープシーケンス
| 順序 | 意味 |
|---|---|
\n |
改行(次の行へ移動) |
\t |
タブ(テキストの揃え) |
\\ |
バックスラッシュ |
\" |
ダブルクォート |
CPP
std::cout << "Name:\tAlice\nAge:\t20\n";
出力:
TEXT
Name: Alice
Age: 20
(2) 1.2 endl 対 \n
どちらも改行しますが、std::endl はさらに 出力バッファをフラッシュ します(保留中の出力をすべて強制的に書き込みます)。ほとんどの場合は \n を使用してください。こちらの方が高速です。
CPP
std::cout << "Hello" << std::endl; // Slower (flushes buffer)
std::cout << "Hello\n"; // Faster
💡 ヒント:
std::endl は、すぐにフラッシュする必要がある場合(例:直ちに表示する必要があるデバッグ出力など)にのみ使用してください。通常の出力については、\n の方が効率的です。
(3) 2.1 小数点以下の桁数の制御
CPP
#include iostream
#include iomanip // For setprecision and fixed
int main() {
double pi = 3.1415926535;
std::cout << "Default: " << pi << std::endl;
std::cout << "3 decimals: " << std::fixed << std::setprecision(3) << pi << std::endl;
std::cout << "5 decimals: " << std::setprecision(5) << pi << std::endl;
return 0;
}
出力:
TEXT
Default: 3.14159
3 decimals: 3.142
5 decimals: 3.14159
(4) 2.2 出力幅の制御
CPP
#include iostream
#include iomanip
int main() {
std::cout << std::setw(10) << "Name" << std::setw(10) << "Score" << std::endl;
std::cout << std::setw(10) << "Alice" << std::setw(10) << 95 << std::endl;
std::cout << std::setw(10) << "Bob" << std::setw(10) << 87 << std::endl;
return 0;
}
出力:
TEXT
Name Score
Alice 95
Bob 87
💡 ヒント:
std::setw() は、次に出力される値にのみ適用されます。各値を出力する前に設定する必要があります。
2. cin を使った入力
(1) 3.1 スペースの問題
cin >> は、最初の空白文字(スペース、タブ、改行)で読み取りを停止します。つまり、フルネームを読み取ることができません:
CPP
std::string name;
std::cout << "Enter your full name: ";
std::cin >> name; // Only reads the first word!
std::cout << name; // If you enter "Alice Smith", only "Alice" is stored
(2) 3.2 行全体を取得するための getline の使用
スペースを含む行全体を読み取るには、std::getline を使用します:
CPP
#include iostream
#include string
int main() {
std::string fullName;
std::cout << "Enter your full name: ";
std::getline(std::cin, fullName);
std::cout << "Hello, " << fullName << "!" << std::endl;
return 0;
}
(3) 3.3 cin >> と getline の併用に関する問題
cin >> の後に getline を使用すると、入力バッファに余分な改行が残ってしまいます:
CPP
int age;
std::string name;
std::cout << "Age: ";
std::cin >> age; // Reads 25, leaves '\n' in the buffer
std::cin.ignore(); // ⚠️ Must discard the leftover newline!
std::cout << "Name: ";
std::getline(std::cin, name); // Now works correctly
(4) ▶ サンプル:1:ユーザー登録フォーム(難易度 ⭐⭐)
CPP
#include iostream
#include string
#include iomanip
int main() {
std::string name, city;
int age;
std::cout << "=== User Registration ===" << std::endl;
std::cout << "Name: ";
std::getline(std::cin, name);
std::cout << "Age: ";
std::cin >> age;
std::cin.ignore();
std::cout << "City: ";
std::getline(std::cin, city);
std::cout << "\n--- Registration Summary ---" << std::endl;
std::cout << std::left;
std::cout << std::setw(10) << "Name" << ": " << name << std::endl;
std::cout << std::setw(10) << "Age" << ": " << age << std::endl;
std::cout << std::setw(10) << "City" << ": " << city << std::endl;
return 0;
}
3. ファイルの入出力の基礎
fstream を使えば、ファイルの読み書きは簡単です:
CPP
#include iostream
#include fstream
int main() {
// Writing to a file
std::ofstream outFile("data.txt");
outFile << "Hello, file!" << std::endl;
outFile << "Line 2" << std::endl;
outFile.close(); // Always close when done!
// Reading from a file
std::ifstream inFile("data.txt");
std::string line;
while (std::getline(inFile, line)) {
std::cout << line << std::endl;
}
inFile.close();
return 0;
}
💡 ヒント:
ofstream = 出力ファイルストリーム(書き込み用)、ifstream = 入力ファイルストリーム(読み取り用)。処理が完了したら、必ず close() を呼び出して、システムリソースを解放してください。
▶ サンプル 1: input output cin coutデモ (難易度 ⭐)
CPP
#include <iostream>
int main() {
// input output cin coutの
std::cout << "input output cin coutをびましょう!" << std::endl;
return 0;
}
❓ よくある質問
Q コンソールで中国語のテキストが文字化けしてしまうのはなぜですか?
A これは Windows コンソールのエンコーディングに関する問題です。プログラムの先頭に
system("chcp 65001"); を追加して、UTF-8 に切り替えてください。macOS や Linux では通常、この問題は発生しません。Q cin や cout の前に必ず std:: を付ける必要がありますか?
A はい。ただし、先頭に
using namespace std; と記述している場合は例外です。ただし、この方法は推奨されません。グローバルネームスペースを汚染し、大規模なプロジェクトでは命名衝突を引き起こす可能性があるためです。Q 画面をクリアするにはどうすればよいですか?
A Windowsの場合:
system("cls"); macOS/Linuxの場合:system("clear"); ただし、これは移植性に欠けるため、本番コードでは使用を避けてください。Q なぜ getline を使って整数を読み取ることができないのですか?
A
getline は文字列のみを読み取ります。整数を読み取るには cin >> を使用してください。行を読み取って解析する必要がある場合は、std::stoi(line) を使用して文字列を整数に変換してください。📖 まとめ
coutは、書式設定にエスケープシーケンス (\n,\t) を使用しています- 小数点以下の桁数を制御するには、
std::fixed+std::setprecision(n)を使用してください cin >>はスペースで停止します。行全体を処理するにはgetlineを使用してくださいcin >>とgetlineを混合する際は、余分な改行を削除するためにcin.ignore()を追加してください- ファイル操作には
#include fstreamが必要です
📝 練習問題
-
初心者(難易度 ⭐): タブで揃えた1から9までの九九を表示するプログラムを作成してください。
-
中級(難易度 ⭐⭐): 商品名(スペースを含む場合あり)、単価、数量を入力するプログラムを作成してください。書式を整えたレシートを表示してください。
-
上級(難易度 ⭐⭐⭐): 3件の連絡先(名前、電話番号、関係)を入力させ、それらをファイルに書き出し、その後読み込んで表示する「連絡先登録」プログラムを作成してください。



