C++ 标准库通过 <iostream> 提供与终端交互的流对象:std::cin 从标准输入读取,std::cout 向标准输出写入,std::cerr 常用于错误信息。本节说明流插入与提取运算符的用法、流状态检查、常见格式化需求,以及读取字符串与数值时的注意点。

输出到标准输出

C++ cout 链式输出运行
#include <iostream>

int main() {
    int year = 2026;
    std::cout << "Year: " << year << std::endl;
    return 0;
}

多个 << 可链式连接;std::endl 输出换行并刷新缓冲区。若只需换行而不立即刷新,可使用 '\n',在高频输出时略省开销:

std::cout << "Line one\n" << "Line two\n";

从标准输入读取

使用 std::cin >> variable 读取数值或不含空白的单词。读取失败时流进入 fail 状态,后续读取须先 clear() 并丢弃错误输入,否则可能陷入死循环。

#include <iostream>

int main() {
    int age = 0;
    std::cout << "Enter age: ";
    if (std::cin >> age) {
        std::cout << "You entered: " << age << std::endl;
    } else {
        std::cerr << "invalid input\n";
    }
    return 0;
}

读取整行:getline

读取含空格的整行文本时,在数值读取后常需忽略行尾换行,再使用 std::getline(std::cin, line)(头文件 <string>):

#include <iostream>
#include <string>
#include <limits>

int main() {
    int id = 0;
    std::cout << "id: ";
    std::cin >> id;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    std::string name;
    std::cout << "name: ";
    std::getline(std::cin, name);
    std::cout << id << " " << name << '\n';
    return 0;
}

混用 operator>> 与 getline 时,留在缓冲区中的换行符常使下一次 getline 读到空行,上述 ignore 可缓解。

格式化与精度(入门)

需要控制浮点小数位数时,可使用头文件 <iomanip> 中的操纵符,例如 std::fixed 与 std::setprecision:

#include <iomanip>
#include <iostream>

int main() {
    double v = 3.1415926;
    std::cout << std::fixed << std::setprecision(2) << v << std::endl;
    return 0;
}

输出:

3.14
操纵符(节选)作用
std::setw(n)下一字段最小宽度
std::setfill(c)填充字符
std::left / std::right对齐方式

命名空间 std

标准库标识符位于命名空间 std 中。教学示例中写全 std::cout 以避免与自定义名称冲突;在单文件练习中也有人使用 using std::cout;,大型工程中更推荐显式前缀或局部 using(见命名空间)。

与 C 的 printf / scanf 相比,流接口在类型不匹配时更易在编译期报错;需要与 C 库交互时仍可使用 cstdio。

本节说明了 cin、cout 的基本用法、getline 与简单的格式化输出。流对象与操纵符的逐条查阅见标准库 <iostream>。下一节介绍注释的写法与维护代码时的使用习惯。