C++: cinとcoutによる入出力
最終更新:2026-08-31
ここまで
std::coutとstd::cinを見てきた。このレッスンでは、C++の入出力を深く掘り下げる——きれいな書式出力と正しい入力処理は必須スキルだから。
1. coutによる書式出力
単純なstd::coutは、テキストを表示するだけならもっとできる。
(1) 1.1 エスケープシーケンス
| シーケンス | 意味 |
|---|---|
\n |
改行(次の行へ) |
\t |
タブ(文字揃え) |
\\ |
バックスラッシュ |
\" |
ダブルクォート |
CPP
std::cout << "名前:\tAlice\n年齢:\t20\n";
出力:
TEXT
📖 参照専用
名前: Alice
年齢: 20
(2) 1.2 endl vs \n
どちらも改行するが、std::endlは出力バッファをフラッシュ(保留中の出力を強制書き込み)する。通常は\nを使おう——速い。
CPP
std::cout << "Hello" << std::endl; // 遅い(バッファをフラッシュ)
std::cout << "Hello\n"; // 速い
💡 ヒント: 即座にフラッシュが必要な場合(デバッグ出力など)だけ
std::endlを使う。通常の出力では\nの方が効率的。
(3) 2.1 小数桁数の制御
CPP
#include <iostream>
#include <iomanip> // setPrecisionとfixed用
int main() {
double pi = 3.1415926535;
std::cout << "デフォルト: " << pi << std::endl;
std::cout << "小数3桁: " << std::fixed << std::setprecision(3) << pi << std::endl;
std::cout << "小数5桁: " << std::setprecision(5) << pi << std::endl;
return 0;
}
出力:
TEXT
📖 参照専用
デフォルト: 3.14159
小数3桁: 3.142
小数5桁: 3.14159
(4) 2.2 出力幅の制御
CPP
#include <iostream>
#include <iomanip>
int main() {
std::cout << std::setw(10) << "名前" << std::setw(10) << "スコア" << 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
📖 参照専用
名前 スコア
Alice 95
Bob 87
💡 ヒント:
std::setw()は次の値にのみ適用される。各値の前に設定する必要がある。
2. cinによる入力
(1) 3.1 スペースの問題
cin >>は最初の空白(スペース、タブ、改行)で読み取りを止める。これではフルネームを読めない:
CPP
std::string name;
std::cout << "フルネームを入力: ";
std::cin >> name; // 最初の単語しか読まない!
std::cout << name; // "Alice Smith"と入力しても"Alice"しか格納されない
(2) 3.2 getlineによる行全体の読み取り
std::getlineを使えば、スペースを含む行全体を読み取れる:
CPP
#include <iostream>
#include <string>
int main() {
std::string fullName;
std::cout << "フルネームを入力: ";
std::getline(std::cin, fullName);
std::cout << "こんにちは、" << fullName << "さん!" << std::endl;
return 0;
}
(3) 3.3 cin >> と getline の混在問題
cin >>の後にgetlineを使うと、入力バッファに改行が残る:
CPP
int age;
std::string name;
std::cout << "年齢: ";
std::cin >> age; // 25を読み取り、'\n'をバッファに残す
std::cin.ignore(); // ⚠️ 残った改行を捨てる必要がある!
std::cout << "名前: ";
std::getline(std::cin, name); // これで正しく動作
▶ サンプル 1:ユーザー登録フォーム(難易度 ⭐⭐)
CPP
#include <iostream>
#include <string>
#include <iomanip>
int main() {
std::string name, city;
int age;
std::cout << "=== ユーザー登録 ===" << std::endl;
std::cout << "名前: ";
std::getline(std::cin, name);
std::cout << "年齢: ";
std::cin >> age;
std::cin.ignore();
std::cout << "都市: ";
std::getline(std::cin, city);
std::cout << "\n--- 登録情報 ---" << std::endl;
std::cout << std::left;
std::cout << std::setw(10) << "名前" << ": " << name << std::endl;
std::cout << std::setw(10) << "年齢" << ": " << age << std::endl;
std::cout << std::setw(10) << "都市" << ": " << city << std::endl;
return 0;
}
3. ファイル入出力の基礎
fstreamを使えば、ファイルの読み書きは簡単:
CPP
#include <iostream>
#include <fstream>
int main() {
// ファイルへの書き込み
std::ofstream outFile("data.txt");
outFile << "Hello, file!" << std::endl;
outFile << "Line 2" << std::endl;
outFile.close(); // 終わったら必ず閉じる!
// ファイルからの読み取り
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()を呼ぶ。
▶ サンプル 2:ファイルの読み書き(難易度 ⭐⭐)
CPP
#include <iostream>
#include <fstream>
#include <string>
int main() {
// ファイルに書き込み
std::ofstream outFile("data.txt");
outFile << "Alice,85" << std::endl;
outFile << "Bob,92" << std::endl;
outFile << "Charlie,78" << std::endl;
outFile.close();
// ファイルから読み取り
std::ifstream inFile("data.txt");
std::string line;
std::cout << "学生データ:" << std::endl;
while (std::getline(inFile, line)) {
std::cout << " " << line << std::endl;
}
inFile.close();
return 0;
}
出力:
TEXT 📖 参照専用学生データ: Alice,85 Bob,92 Charlie,78
▶ サンプル 3:書式テーブル出力(難易度 ⭐⭐)
CPP
#include <iostream>
#include <iomanip>
int main() {
std::cout << std::left;
std::cout << std::setw(15) << "商品"
<< std::setw(10) << "価格"
<< std::setw(10) << "数量" << std::endl;
std::cout << std::string(35, '-') << std::endl;
std::cout << std::setw(15) << "りんご"
<< std::setw(10) << "¥150"
<< std::setw(10) << "10" << std::endl;
std::cout << std::setw(15) << "バナナ"
<< std::setw(10) << "¥75"
<< std::setw(10) << "20" << std::endl;
std::cout << std::setw(15) << "オレンジ"
<< std::setw(10) << "¥200"
<< std::setw(10) << "15" << std::endl;
return 0;
}
出力:
TEXT 📖 参照専用商品 価格 数量 ----------------------------------- りんご ¥150 10 バナナ ¥75 20 オレンジ ¥200 15
❓ よくある質問
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でintを読めない?
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つの連絡先(名前、電話番号、関係)を尋ね、ファイルに書き込み、読み取って表示。