C++输入输出 #

一、输入输出概述 #

C++使用流(stream)的概念进行输入输出操作:

  • cin:标准输入流(键盘)
  • cout:标准输出流(屏幕)
  • cerr:标准错误流(无缓冲)
  • clog:标准日志流(有缓冲)
cpp
#include <iostream>

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

二、标准输出cout #

2.1 基本输出 #

cpp
#include <iostream>

int main() {
    // 输出字符串
    std::cout << "Hello";
    
    // 输出数字
    std::cout << 123;
    
    // 输出字符
    std::cout << 'A';
    
    // 链式输出
    std::cout << "Hello" << ", " << "World" << std::endl;
    
    return 0;
}

2.2 换行方式 #

cpp
// 方式1:endl(换行并刷新缓冲区)
std::cout << "Line 1" << std::endl;
std::cout << "Line 2" << std::endl;

// 方式2:\n(只换行)
std::cout << "Line 1\n";
std::cout << "Line 2\n";

// 方式3:'\n'字符
std::cout << "Line 1" << '\n';

2.3 输出不同类型 #

cpp
#include <iostream>
#include <string>

int main() {
    int i = 123;
    double d = 3.14159;
    char c = 'A';
    bool b = true;
    std::string s = "Hello";
    
    std::cout << "int: " << i << std::endl;
    std::cout << "double: " << d << std::endl;
    std::cout << "char: " << c << std::endl;
    std::cout << "bool: " << b << std::endl;        // 输出1
    std::cout << "bool: " << std::boolalpha << b << std::endl;  // 输出true
    std::cout << "string: " << s << std::endl;
    
    return 0;
}

三、标准输入cin #

3.1 基本输入 #

cpp
#include <iostream>
#include <string>

int main() {
    int age;
    std::string name;
    
    std::cout << "请输入年龄: ";
    std::cin >> age;
    
    std::cout << "请输入姓名: ";
    std::cin >> name;
    
    std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
    
    return 0;
}

3.2 连续输入 #

cpp
int a, b, c;
std::cin >> a >> b >> c;  // 输入:10 20 30

// 空格、制表符、换行符作为分隔符

3.3 读取字符串 #

cpp
#include <iostream>
#include <string>

int main() {
    std::string word;
    std::string line;
    
    // cin >> 读取单词(遇到空格停止)
    std::cout << "输入单词: ";
    std::cin >> word;
    std::cout << "单词: " << word << std::endl;
    
    // 清除缓冲区
    std::cin.ignore();
    
    // getline读取整行
    std::cout << "输入一行: ";
    std::getline(std::cin, line);
    std::cout << "整行: " << line << std::endl;
    
    return 0;
}

3.4 输入验证 #

cpp
#include <iostream>
#include <limits>

int main() {
    int number;
    
    while (true) {
        std::cout << "请输入一个整数: ";
        std::cin >> number;
        
        if (std::cin.fail()) {
            std::cout << "输入无效,请重新输入!" << std::endl;
            std::cin.clear();  // 清除错误状态
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        } else {
            break;
        }
    }
    
    std::cout << "你输入的数字是: " << number << std::endl;
    
    return 0;
}

四、格式化输出 #

4.1 包含头文件 #

cpp
#include <iostream>
#include <iomanip>  // 格式化控制符

4.2 宽度设置 #

cpp
#include <iostream>
#include <iomanip>

int main() {
    // setw设置宽度(只对下一个输出有效)
    std::cout << std::setw(10) << 123 << std::endl;      // "       123"
    std::cout << std::setw(10) << 123456 << std::endl;   // "    123456"
    
    // 左对齐/右对齐
    std::cout << std::left << std::setw(10) << 123 << "end" << std::endl;   // "123       end"
    std::cout << std::right << std::setw(10) << 123 << "end" << std::endl;  // "       123end"
    
    return 0;
}

4.3 填充字符 #

cpp
#include <iostream>
#include <iomanip>

int main() {
    // setfill设置填充字符
    std::cout << std::setfill('0') << std::setw(5) << 123 << std::endl;  // "00123"
    std::cout << std::setfill('*') << std::setw(5) << 123 << std::endl;  // "**123"
    
    return 0;
}

4.4 精度设置 #

cpp
#include <iostream>
#include <iomanip>

int main() {
    double pi = 3.141592653589793;
    
    // setprecision设置精度
    std::cout << std::setprecision(4) << pi << std::endl;  // 3.142
    
    // 固定小数位数
    std::cout << std::fixed << std::setprecision(2) << pi << std::endl;  // 3.14
    
    // 科学计数法
    std::cout << std::scientific << std::setprecision(2) << pi << std::endl;  // 3.14e+00
    
    // 恢复默认
    std::cout << std::defaultfloat << pi << std::endl;
    
    return 0;
}

4.5 进制设置 #

cpp
#include <iostream>

int main() {
    int num = 255;
    
    // 十进制
    std::cout << "十进制: " << std::dec << num << std::endl;  // 255
    
    // 十六进制
    std::cout << "十六进制: " << std::hex << num << std::endl;  // ff
    
    // 八进制
    std::cout << "八进制: " << std::oct << num << std::endl;  // 377
    
    // 显示进制前缀
    std::cout << std::showbase;
    std::cout << "十六进制: " << std::hex << num << std::endl;  // 0xff
    std::cout << "八进制: " << std::oct << num << std::endl;    // 0377
    
    // 大写十六进制
    std::cout << std::uppercase;
    std::cout << "十六进制: " << std::hex << num << std::endl;  // 0XFF
    
    return 0;
}

4.6 布尔值输出 #

cpp
#include <iostream>

int main() {
    bool b = true;
    
    // 默认输出0/1
    std::cout << b << std::endl;  // 1
    
    // 输出true/false
    std::cout << std::boolalpha << b << std::endl;  // true
    
    // 恢复数字输出
    std::cout << std::noboolalpha << b << std::endl;  // 1
    
    return 0;
}

4.7 正号显示 #

cpp
#include <iostream>

int main() {
    int num = 123;
    
    // 显示正号
    std::cout << std::showpos << num << std::endl;  // +123
    std::cout << -num << std::endl;  // -123
    
    // 隐藏正号
    std::cout << std::noshowpos << num << std::endl;  // 123
    
    return 0;
}

五、格式化表格示例 #

cpp
#include <iostream>
#include <iomanip>
#include <string>

int main() {
    std::cout << std::left;
    std::cout << std::setw(10) << "姓名" 
              << std::setw(8) << "语文" 
              << std::setw(8) << "数学" 
              << std::setw(8) << "英语" 
              << std::setw(8) << "平均分" << std::endl;
    
    std::cout << std::string(42, '-') << std::endl;
    
    std::cout << std::setw(10) << "张三" 
              << std::setw(8) << 85 
              << std::setw(8) << 90 
              << std::setw(8) << 78 
              << std::setw(8) << std::fixed << std::setprecision(1) << 84.3 << std::endl;
    
    std::cout << std::setw(10) << "李四" 
              << std::setw(8) << 92 
              << std::setw(8) << 88 
              << std::setw(8) << 95 
              << std::setw(8) << 91.7 << std::endl;
    
    return 0;
}

输出:

text
姓名      语文     数学     英语     平均分   
------------------------------------------
张三      85       90       78       84.3    
李四      92       88       95       91.7    

六、流状态 #

6.1 流状态标志 #

cpp
#include <iostream>

int main() {
    int x;
    
    // goodbit:正常状态
    std::cout << std::cin.good() << std::endl;  // 1
    
    // 输入错误类型
    std::cout << "输入一个整数: ";
    std::cin >> x;  // 如果输入非数字
    
    // failbit:输入/输出失败
    if (std::cin.fail()) {
        std::cout << "输入失败" << std::endl;
        std::cin.clear();  // 清除错误状态
    }
    
    // badbit:流被破坏
    // eofbit:到达文件末尾
    
    return 0;
}

6.2 状态检查 #

cpp
#include <iostream>

int main() {
    int x;
    
    // 检查流状态
    while (std::cin >> x) {
        std::cout << "读取到: " << x << std::endl;
    }
    
    // 检查是否到达EOF
    if (std::cin.eof()) {
        std::cout << "到达文件末尾" << std::endl;
    }
    
    // 检查是否失败
    if (std::cin.fail()) {
        std::cout << "输入失败" << std::endl;
    }
    
    return 0;
}

七、错误输出cerr和clog #

7.1 cerr(无缓冲) #

cpp
#include <iostream>

int main() {
    // cerr用于错误输出,无缓冲,立即输出
    std::cerr << "Error: 文件打开失败!" << std::endl;
    
    return 0;
}

7.2 clog(有缓冲) #

cpp
#include <iostream>

int main() {
    // clog用于日志输出,有缓冲
    std::clog << "Log: 程序启动" << std::endl;
    
    return 0;
}

八、常用格式化控制符 #

8.1 格式化控制符一览 #

控制符 说明
setw(n) 设置宽度
setfill(c) 设置填充字符
setprecision(n) 设置精度
fixed 固定小数格式
scientific 科学计数法
hex 十六进制
oct 八进制
dec 十进制
left 左对齐
right 右对齐
boolalpha 布尔值输出true/false
showbase 显示进制前缀
showpos 显示正号
uppercase 大写输出

8.2 使用示例 #

cpp
#include <iostream>
#include <iomanip>

int main() {
    double value = 1234.56789;
    
    // 组合使用
    std::cout << std::fixed << std::setprecision(2) 
              << std::setw(12) << std::setfill('*') 
              << std::right << value << std::endl;
    // 输出: ****1234.57
    
    return 0;
}

九、输入输出最佳实践 #

9.1 使用using声明 #

cpp
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main() {
    cout << "Hello" << endl;
    return 0;
}

9.2 避免使用using namespace std #

cpp
// 不推荐(在头文件中尤其危险)
using namespace std;

// 推荐:使用完整限定名或using声明
std::cout << "Hello" << std::endl;

9.3 输入验证 #

cpp
#include <iostream>
#include <limits>

int getInteger(const std::string& prompt) {
    int value;
    while (true) {
        std::cout << prompt;
        if (std::cin >> value) {
            return value;
        }
        std::cout << "输入无效,请重新输入!" << std::endl;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

9.4 格式化输出封装 #

cpp
#include <iostream>
#include <iomanip>

void printTableHeader(const std::string headers[], int count, int width) {
    for (int i = 0; i < count; i++) {
        std::cout << std::setw(width) << std::left << headers[i];
    }
    std::cout << std::endl;
    std::cout << std::string(width * count, '-') << std::endl;
}

void printTableRow(const std::string values[], int count, int width) {
    for (int i = 0; i < count; i++) {
        std::cout << std::setw(width) << std::left << values[i];
    }
    std::cout << std::endl;
}

十、总结 #

输入输出要点 #

流对象 用途 缓冲
cin 标准输入
cout 标准输出
cerr 错误输出
clog 日志输出

常用操作 #

cpp
// 输出
std::cout << "Hello" << std::endl;

// 输入
std::cin >> variable;

// 读取整行
std::getline(std::cin, line);

// 格式化
std::cout << std::setw(10) << std::setprecision(2) << value << std::endl;

下一步,让我们学习运算符!

最后更新:2026-03-26