<iostream> 基础设施

<iostream> 是 C++ 标准库中的一个头文件,提供了输入输出流的功能。它包括了用于数据输入和输出的主要组件,如 std::cinstd::coutstd::cerrstd::clog。这些组件是实现控制台输入输出的基础设施,使得数据的读写操作更加高效和便捷。

1. 流对象

  • std::cin: 标准输入流对象,通常用于从控制台读取输入数据。
  • std::cout: 标准输出流对象,通常用于向控制台输出数据。
  • std::cerr: 标准错误流对象,通常用于输出错误信息。与 std::cout 相比,std::cerr 不会进行缓冲。
  • std::clog: 标准日志流对象,用于输出日志信息。std::clog 具有缓冲特性,通常用于非实时的日志记录。

2. 基本用法

输入操作

通过 std::cin 可以读取来自标准输入的各种数据类型:

#include <iostream>

int main() {
    int age;
    std::cout << "Enter your age: ";
    std::cin >> age;
    std::cout << "Your age is: " << age << std::endl;
    return 0;
}

在这个示例中,std::cin >> age; 从标准输入中读取一个整数并将其存储在 age 变量中。

输出操作

通过 std::cout 可以将数据输出到标准输出:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

在这个示例中,std::cout << "Hello, World!" << std::endl; 将 "Hello, World!" 输出到控制台,并在输出后换行。

3. 流操作符

  • 插入操作符 (<<): 用于将数据写入流。例如,std::cout << 42; 将整数 42 写入输出流。
  • 提取操作符 (>>): 用于从流中读取数据。例如,std::cin >> age; 从输入流中读取数据并存储到 age 变量中。

4. 格式化输出

<iostream> 还提供了格式化输出的功能,通过流操控器(如 std::setwstd::setprecisionstd::fixed 等)可以控制输出的格式。

示例

#include <iostream>
#include <iomanip> // 需要包含这个头文件来使用 std::setw 和 std::setprecision

int main() {
    double pi = 3.14159265358979323846;
    
    std::cout << "Default precision: " << pi << std::endl;
    std::cout << "Precision to 2 decimal places: " << std::fixed << std::setprecision(2) << pi << std::endl;
    std::cout << "Field width of 10: |" << std::setw(10) << pi << "|" << std::endl;
    
    return 0;
}

在这个示例中,std::fixedstd::setprecision(2) 用于设置浮点数的精度,std::setw(10) 用于设置字段宽度。

5. 流状态

流对象提供了一些成员函数用于检查流的状态,如是否遇到错误或是否到达流的末尾。

  • std::cin.eof(): 检查是否到达输入流的末尾。
  • std::cin.fail(): 检查输入操作是否失败。
  • std::cin.good(): 检查流的状态是否正常。

示例

#include <iostream>

int main() {
    int number;
    std::cout << "Enter a number: ";
    while (std::cin >> number) {
        std::cout << "You entered: " << number << std::endl;
        if (std::cin.eof()) break; // End of input
        if (std::cin.fail()) {
            std::cin.clear(); // Clear the error state
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Ignore the bad input
            std::cout << "Invalid input. Please enter a number: ";
        }
    }
    
    return 0;
}

在这个示例中,程序读取整数并检测输入是否有效。如果输入无效,程序清除错误状态并提示用户重新输入。

6. 流缓冲

std::coutstd::cerr 的输出是缓冲的,即在缓冲区满之前,输出不会立即显示。可以通过 std::flush 强制刷新缓冲区,也可以通过 std::endl 实现换行并刷新缓冲区。

示例

#include <iostream>

int main() {
    std::cout << "This is a test" << std::flush; // 强制刷新缓冲区
    std::cout << "This is a test with endl" << std::endl; // 刷新缓冲区并换行
    return 0;
}

7. 总结

<iostream> 提供了 C++ 中最基本和最常用的输入输出功能。通过使用 std::cinstd::coutstd::cerrstd::clog,可以实现数据的输入、输出、错误报告和日志记录。了解 <iostream> 的各种特性和功能,可以帮助开发者更有效地进行数据的处理和调试。