iostream
是 C++ 標準庫中用于輸入輸出操作的核心庫,它基于面向對象的設計,提供了比 C 語言的 stdio.h
更強大、更安全的 I/O 功能。下面詳細介紹 iostream
庫中最常用的輸入輸出工具:cin
和 cout
。
一、 基本概念
iostream
庫:包含在<iostream>
頭文件中,提供標準輸入輸出流。- 標準流對象:
cin
:標準輸入流(通常對應鍵盤)。cout
:標準輸出流(通常對應控制臺)。cerr
:標準錯誤流(無緩沖,直接輸出)。clog
:標準日志流(有緩沖)。
二、 cout
的基本用法
輸出基本數據類型
#include <iostream>int main() {int num = 42;double pi = 3.14159;char letter = 'A';std::string name = "Alice"; // 需要包含 <string> 頭文件// 輸出變量std::cout << "整數: " << num << std::endl;std::cout << "浮點數: " << pi << std::endl;std::cout << "字符: " << letter << std::endl;std::cout << "字符串: " << name << std::endl;// 輸出表達式std::cout << "1 + 2 = " << (1 + 2) << std::endl;return 0;
}
輸出結果:
整數: 42
浮點數: 3.14159
字符: A
字符串: Alice
1 + 2 = 3
格式化輸出
使用 std::endl
或 '\n'
換行:
std::cout << "第一行" << std::endl;
std::cout << "第二行\n"; // '\n' 更高效,不強制刷新緩沖區
使用 std::setw()
和 std::setfill()
控制寬度和填充字符(需包含 <iomanip>
):
#include <iomanip>std::cout << std::setw(10) << std::setfill('*') << "Hello" << std::endl;
// 輸出:*****Hello
三、 cin
的基本用法
輸入基本數據類型
#include <iostream>int main() {int age;double salary;std::string name;std::cout << "請輸入姓名: ";std::cin >> name; // 讀取一個單詞(空格分隔)std::cout << "請輸入年齡: ";std::cin >> age;std::cout << "請輸入薪水: ";std::cin >> salary;std::cout << "姓名: " << name << ", 年齡: " << age << ", 薪水: " << salary << std::endl;return 0;
}
輸入示例:
請輸入姓名: Alice
請輸入年齡: 25
請輸入薪水: 5000.5
姓名: Alice, 年齡: 25, 薪水: 5000.5
輸入多行字符串
cin >>
遇到空格會停止讀取,若要讀取整行,使用 std::getline()
:
#include <iostream>
#include <string>int main() {std::string fullName;std::cout << "請輸入全名: ";std::getline(std::cin, fullName); // 讀取整行(包括空格)std::cout << "你好, " << fullName << std::endl;return 0;
}
四、 輸入輸出重定向
可以將 cin
和 cout
重定向到文件:
#include <iostream>
#include <fstream>int main() {// 輸出重定向到文件std::ofstream outFile("output.txt");std::streambuf* coutBuf = std::cout.rdbuf();std::cout.rdbuf(outFile.rdbuf());std::cout << "這句話會寫入文件" << std::endl;// 恢復標準輸出std::cout.rdbuf(coutBuf);std::cout << "這句話會顯示在控制臺" << std::endl;return 0;
}
五、 常見問題與解決方案
1. cin
緩沖區殘留問題
若先使用 cin >>
讀取數值,再用 getline()
讀取字符串,可能導致 getline()
讀取到殘留的換行符。
解決方案:
int num;
std::string line;std::cin >> num;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 清除緩沖區
std::getline(std::cin, line); // 正常讀取
2. 輸入驗證
檢查輸入是否合法:
int num;
std::cout << "請輸入整數: ";
if (!(std::cin >> num)) {std::cout << "輸入無效,請輸入整數!" << std::endl;std::cin.clear(); // 清除錯誤標志std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 清除緩沖區
}
六、 進階用法
格式化輸出(精度控制)
#include <iomanip>double pi = 3.14159265358979;
std::cout << std::fixed << std::setprecision(4) << pi << std::endl; // 輸出 3.1416
自定義類型的 I/O
重載 <<
和 >>
運算符:
class Point {
private:int x, y;
public:// 重載 << 運算符friend std::ostream& operator<<(std::ostream& os, const Point& p) {os << "(" << p.x << ", " << p.y << ")";return os;}// 重載 >> 運算符friend std::istream& operator>>(std::istream& is, Point& p) {is >> p.x >> p.y;return is;}
};// 使用示例
Point p;
std::cin >> p; // 輸入: 3 4
std::cout << p; // 輸出: (3, 4)
七、總結
cout
:用<<
輸出數據,支持鏈式調用(如cout << a << b
)。cin
:用>>
讀取數據,默認以空格分隔,可用getline()
讀取整行。- 格式化:通過
<iomanip>
控制輸出寬度、精度、填充字符等。 - 注意事項:處理輸入緩沖區殘留、輸入驗證和自定義類型的 I/O 重載。
通過這些基本操作,可以實現大多數控制臺程序的輸入輸出功能。