C++ 中的 iostream 库:cin/cout 基本用法

iostream 是 C++ 标准库中用于输入输出操作的核心库,它基于面向对象的设计,提供了比 C 语言的 stdio.h 更强大、更安全的 I/O 功能。下面详细介绍 iostream 库中最常用的输入输出工具:cincout

一、 基本概念

  • iostream :包含在 <iostream> 头文件中,提供标准输入输出流。
  • 标准流对象
    • cin:标准输入流(通常对应键盘)。
    • cout:标准输出流(通常对应控制台)。
    • cerr:标准错误流(无缓冲,直接输出)。
    • clog:标准日志流(有缓冲)。

二、 cout 的基本用法

输出基本数据类型
cpp 复制代码
#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' 换行:

cpp 复制代码
std::cout << "第一行" << std::endl;
std::cout << "第二行\n";  // '\n' 更高效,不强制刷新缓冲区

使用 std::setw()std::setfill() 控制宽度和填充字符(需包含 <iomanip>):

cpp 复制代码
#include <iomanip>

std::cout << std::setw(10) << std::setfill('*') << "Hello" << std::endl;
// 输出:*****Hello

三、 cin 的基本用法

输入基本数据类型
cpp 复制代码
#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()

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string fullName;
    std::cout << "请输入全名: ";
    std::getline(std::cin, fullName);  // 读取整行(包括空格)
    std::cout << "你好, " << fullName << std::endl;
    return 0;
}

四、 输入输出重定向

可以将 cincout 重定向到文件:

cpp 复制代码
#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() 读取到残留的换行符。
解决方案

cpp 复制代码
int num;
std::string line;

std::cin >> num;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 清除缓冲区
std::getline(std::cin, line);  // 正常读取
2. 输入验证

检查输入是否合法:

cpp 复制代码
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');  // 清除缓冲区
}

六、 进阶用法

格式化输出(精度控制)
cpp 复制代码
#include <iomanip>

double pi = 3.14159265358979;
std::cout << std::fixed << std::setprecision(4) << pi << std::endl;  // 输出 3.1416
自定义类型的 I/O

重载 <<>> 运算符:

cpp 复制代码
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 重载。

通过这些基本操作,可以实现大多数控制台程序的输入输出功能。

相关推荐
一只小小汤圆5 分钟前
如何xml序列化 和反序列化类中包含的类
xml·开发语言·c#
南枝异客12 分钟前
电话号码的字母组合
开发语言·javascript·算法
未来并未来36 分钟前
Sentinel 流量控制安装与使用
开发语言·python·sentinel
Halo_tjn1 小时前
Java IO
java·开发语言
我命由我123451 小时前
STM32 开发 - 中断案例(中断概述、STM32 的中断、NVIC 嵌套向量中断控制器、外部中断配置寄存器组、EXTI 外部中断控制器、实例实操)
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
东皇太星1 小时前
Python 100个常用函数全面解析
开发语言·python
宋一平工作室2 小时前
单片机队列功能模块的实战和应用
c语言·开发语言·stm32·单片机·嵌入式硬件
CodeWithMe2 小时前
【软件开发】上位机 & 下位机概念
c++
豆豆(设计前端)2 小时前
在 JavaScript 中,你可以使用 Date 对象来获取 当前日期 和 当前时间、当前年份。
开发语言·javascript·ecmascript
luofeiju2 小时前
数字图像处理与OpenCV初探
c++·图像处理·python·opencv·计算机视觉