404 Not Found

404 Not Found


nginx

cin と cout を使った入出力

ここまでで、std::coutstd::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) を使用して文字列を整数に変換してください。

📖 まとめ


📝 練習問題

  1. 初心者(難易度 ⭐): タブで揃えた1から9までの九九を表示するプログラムを作成してください。

  2. 中級(難易度 ⭐⭐): 商品名(スペースを含む場合あり)、単価、数量を入力するプログラムを作成してください。書式を整えたレシートを表示してください。

  3. 上級(難易度 ⭐⭐⭐): 3件の連絡先(名前、電話番号、関係)を入力させ、それらをファイルに書き出し、その後読み込んで表示する「連絡先登録」プログラムを作成してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

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

100%