C++: cinとcoutによる入出力

最終更新:2026-08-31

ここまでstd::coutstd::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)で文字列を整数に変換。

📖 まとめ


📝 練習問題

  1. 初級(難易度 ⭐): タブで整列した九九表(1〜9)を出力するプログラムを書く。

  2. 中級(難易度 ⭐⭐): 商品名(スペースを含む可能性あり)、単価、数量を尋ね、書式設定されたレシートを表示するプログラムを書く。

  3. 上級(難易度 ⭐⭐⭐): 「連絡先登録」プログラムを書く:3つの連絡先(名前、電話番号、関係)を尋ね、ファイルに書き込み、読み取って表示。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%