C++ 输入输出机制剖析
在 C++ 里,输入输出(I/O)看着简单,但其实坑不少。从控制台读数据、写文件到格式化输出,每次都可能遇到状态异常、缓冲区问题或者性能困扰。这篇文章整理了一些实际使用中的经验和注意事项。
标准流对象
C++ 标准库通过流类抽象了 I/O 操作。istream 负责读取,ostream 负责写入,iostream 两者兼备。处理文件和字符串则有 ifstream、ofstream 以及 stringstream。
预定义的三个标准流对象:std::cin(标准输入,关联键盘)、std::cout(标准输出,关联屏幕)、std::cerr(无缓冲的错误输出)和 std::clog(有缓冲的日志输出)。
#include <iostream>
int main() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
std::cout << "You entered: " << number << std::endl;
return 0;
}
这段代码看起来没问题,但用 >> 读数字时,如果用户输入了字母,流就会进入失败状态,后续操作全部失效。所以每次读取后最好检查状态。
状态检查与缓冲区
每次输入操作后可以用 good()、fail()、bad()、eof() 检查流状态。遇到格式错误,需要 clear() 清除状态位,再用 ignore() 丢弃残留输入。
if (std::cin >> number) {
std::cout << "valid";
} else {
std::cerr << "invalid input\n";
std::cin.clear();
std::cin.ignore(1000, '\n');
}
输出流通常缓冲数据,直到缓冲区满、遇到 std::flush 或 std::endl、程序正常结束才真正写入。但 std::endl 会强制刷新,频繁调用会拖慢性能。大多数场景下用 \n 足够,只在需要立即显示时才显式刷新。
std::cout << "Line 1\n";
std::cout << "Line 2\n";
文件操作
<fstream> 提供了文件读写能力。打开文件时务必检查 ,别假设文件一定存在。虽然析构函数会自动关闭,但如果中途出错提前返回,显式 更清晰。


