C++数据输入输出

梦想不会自己发光,真正闪耀的是那个为梦狂奔的你。献给知行的孩子们!(Eric.He著)


  本教程将从 C++ 数据输入输出的核心分类入手,全面讲解单字符输入输出、流式输入输出、格式化输入输出的用法,并对比分析不同输入输出方式的特性,帮助你掌握C++程序与外部交互的核心技能。

教程目录导航

一、C++ 输入输出核心概述

C++ 输入输出(I/O)是程序与外部设备(键盘、屏幕、文件等)交互的核心机制,主要分为三大类:单字符输入输出(面向单个字符)、流式输入输出(C++标准库iostream)、格式化输入输出(兼容C语言的stdio)。

不同输入输出方式适用于不同场景,核心差异体现在易用性、灵活性、性能和跨平台性上,掌握其特性是编写高效交互程序的基础。

二、单字符输入输出

单字符输入输出专注于单个字符的读取和输出,是最基础的I/O方式,分为C语言风格和C++风格两种实现。

2.1 单字符输出(putchar/putch/cout.put)

语法格式:


// C语言风格:putchar(标准库 stdio.h)
#include <cstdio>
putchar(字符/ASCII码);

// C++风格:cout.put(标准库 iostream)
#include <iostream>
std::cout.put(字符/ASCII码);
        

示例:


#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    // C语言风格单字符输出
    putchar('A');       // 输出字符A
    putchar(65);        // 输出ASCII码65对应的字符A
    putchar('\n');      // 输出换行符
    
    // C++风格单字符输出
    cout.put('B');      // 输出字符B
    cout.put(66);       // 输出ASCII码66对应的字符B
    cout.put('\n');     // 输出换行符
    
    return 0;
}
        

输出结果:


A
A
B
B
        

2.2 单字符输入(getchar/getch/cin.get)

语法格式:


// C语言风格:getchar(标准库 stdio.h)
#include <cstdio>
char ch = getchar();   // 从键盘读取单个字符(需按回车)

// C++风格:cin.get(标准库 iostream)
#include <iostream>
char ch;
std::cin.get(ch);      // 读取单个字符到ch
char ch2 = std::cin.get(); // 读取单个字符并返回
        

示例:


#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    // C语言风格单字符输入
    cout << "请输入一个字符(C风格):";
    char ch1 = getchar();
    cout << "你输入的字符是:";
    putchar(ch1);
    putchar('\n');
    
    // 清除输入缓冲区(避免残留字符影响后续输入)
    while (getchar() != '\n');
    
    // C++风格单字符输入
    cout << "请输入一个字符(C++风格):";
    char ch2;
    cin.get(ch2);
    cout << "你输入的字符是:";
    cout.put(ch2);
    cout.put('\n');
    
    return 0;
}
        

输入输出示例:


请输入一个字符(C风格):X
你输入的字符是:X
请输入一个字符(C++风格):Y
你输入的字符是:Y
        

三、流式输入输出

流式输入输出是C++特有的I/O方式,基于<iostream>标准库,通过cout(输出流)、cin(输入流)实现,支持任意数据类型的输入输出,无需指定格式符,易用性高。

3.1 流式输出(cout)

cout 是输出流对象,通过 << 运算符向标准输出设备(屏幕)输出数据,支持链式调用。

语法格式:


#include <iostream>
std::cout << 数据1 << 数据2 << ... <<  endl;
        

示例:


#include <iostream>
using namespace std;

int main() {
    // 基本数据类型输出
    int a = 100;
    float b = 3.14159;
    char c = 'Z';
    string s = "Hello C++";
    
    // 链式输出
    cout << "整数:" << a << endl;          // 输出整数
    cout << "浮点数:" << b << endl;        // 输出浮点数
    cout << "字符:" << c << endl;          // 输出字符
    cout << "字符串:" << s << endl;        // 输出字符串
    
    // 混合输出
    cout << "组合输出:a=" << a << ", b=" << b << ", c=" << c << endl;
    
    return 0;
}
        

输出结果:


整数:100
浮点数:3.14159
字符:Z
字符串:Hello C++
组合输出:a=100, b=3.14159, c=Z
        

3.2 流式输入(cin)

cin 是输入流对象,通过>>运算符从标准输入设备(键盘)读取数据,自动根据变量类型解析输入。

语法格式:


#include <iostream>
std::cin >> 变量1 >> 变量2 >> ...;
        

示例:


#include <iostream>
#include <string>
using namespace std;

int main() {
    int age;
    float score;
    string name;
    
    cout << "请输入姓名、年龄、成绩(空格分隔):";
    cin >> name >> age >> score;
    
    cout << "\n你的信息:" << endl;
    cout << "姓名:" << name << endl;
    cout << "年龄:" << age << endl;
    cout << "成绩:" << score << endl;
    
    return 0;
}
        

输入输出示例:


请输入姓名、年龄、成绩(空格分隔):小明 18 95.5

你的信息:
姓名:小明
年龄:18
成绩:95.5
        

3.3 流式输入输出注意事项

示例:读取带空格的字符串(getline)


#include <iostream>
#include <string>
using namespace std;

int main() {
    string str;
    cout << "请输入带空格的字符串:";
    cin.ignore(); // 清除输入缓冲区的换行符
    getline(cin, str); // 读取整行(包含空格)
    cout << "你输入的字符串:" << str << endl;
    
    return 0;
}
        

输入输出示例:


请输入带空格的字符串:Hello World C++
你输入的字符串:Hello World C++
        

四、格式化输入输出

格式化输入输出兼容C语言标准库,通过printf()输出函数scanf()输入函数实现,需指定格式符,灵活性高、性能好,是高性能程序的常用选择。

4.1 格式化输出(printf)

printf函数的功能是格式化输出任意数据列表,其一般调用格式为:

语法格式:


#include <cstdio>
printf(格式控制, 输出列表);

【说明】
 (1)格式控制:由格式说明和普通字符组成,必须用双引号括起来。
     1、格式说明由%和格式字符组成,作用是将要输出的字符转换为指定的格式,如%d,%c等。
     2、普通字符是在输出时原样输出的字符,一般在显示时起提示作用。
 (2)输出列表:是需要输出的一组数据(可以为表达式和变量),各参数之间用“,”分开。
  要求格式说明和各输出项在数量和类型上要一一对应,否则将会出现意想不到的错误。 

【实例】
  int a,b;
  printf("%d%d",a,b);
        

printf函数的格式符:

格式符 说明
%d或%i 以带符号的十进制形式输出整数,正数的(+)号省略不输出
%u 以无符号十进制形式输出整数
%o(字母) 以八进制无符号形式输出整数
%x(字母) 以十六进制无符号形式输出整数
%c 输出一个字符
%s 输出字符串
%f 以小数形式输出单、双精度,隐含输出6位小数
%e或%E 以指数形式输出单、双精度,隐含输出6位小数
%g或%G 自动选用%f、%e、%E格式中输出宽度较小的一种使用

d格式符:

参数 说明
%d 输出数字长为变量数值的实际长度
%md 输出m位(不足补空格,大于m位时按实际长度输出)
%-md m含义同上。左对齐输出
%ld l(小写字母)表示输出“长整型”数据
%mld 指定长整型输出宽度m位,左边补空格;否则,按实际位数输出
%0md,%0mld 0(数字0)表示位数不足m时补0

f格式符:

参数 说明
%f 按实数格式输出,整数部分按实际位数输出,6位小数
%m.nf 总位数m(含小数点),其中有n位小数
%-m.nf 总位数m(含小数点),其中有n位小数,左对齐

s格式符:

参数 说明
%s 按实际宽度输出一个字符串
%ms m指定宽度(不足时左补空格,大于时按实际宽度输出)
%-ms 左对齐,不足时右补空格
%m.ns 输出占m个字符位置,其中字符数量最多n个,左补空格
%-m.ns 输出占m个字符位置,其中字符数量最多n个,右补空格

#include <cstdio>
int main() {
    int a = 100;
    float b = 3.1415926;
    char c = 'A';
    char str[] = "Hello C";
    
    // 基本格式化输出
    printf("整数:%d\n", a);                  // %d 十进制整数
    printf("浮点数(默认):%f\n", b);         // %f 浮点数
    printf("浮点数(保留2位):%.2f\n", b);   // 保留2位小数
    printf("字符:%c\n", c);                  // %c 字符
    printf("字符串:%s\n", str);              // %s 字符串
    
    // 混合格式化输出
    printf("组合:a=%d, b=%.3f, c=%c\n", a, b, c);
    
    // 进制输出
    printf("十六进制:%x\n", a);              // 十六进制(小写)
    printf("八进制:%o\n", a);                // 八进制
    
    return 0;
}
        

输出结果:


整数:100
浮点数(默认):3.141593
浮点数(保留2位):3.14
字符:A
字符串:Hello C
组合:a=100, b=3.142, c=A
十六进制:64
八进制:144
        

4.2 格式化输入(scanf)

scanf函数的功能是格式化输入任意数据列表,其一般调用格式为:

语法格式:


#include <cstdio>
scanf(格式控制符, 地址列表);

【说明】
 (1)格式控制符由%和格式符组成,作用是将要输入的字符按指定的格式输入,如%d,%c等。
 (2)地址列表中给出各变量的地址,可以是变量的地址,也可以是字符串的首地址。 

【实例】
  int a,b;
  scanf("%d%d",&a,&b);
        

scanf函数的格式符:

格式符 说明
%d或%i 用于输入十进制整数
%u 以无符号十进制形式输入十进行制整数
%o 用于输入八进制整数
%x 用于输入十六进制整数
%c 用于输入单个字符
%s 用于输入字符串(非空格开始,空格结束,字符串变量以'\0'结尾)
%f 用于输入实数(小数或指数均可)
%e 与f相同(可与f互换)

scanf函数的附加格式说明符:

附加格式 说明
l(字母) 用于长整型数(%ld、%lo、%lx)或double型实数(%lf、%le)
h 用于短整型数(%hd、%ho、%hx)
域宽(一个整数) 指定输入所占列宽。只读取 域宽指定个数 的字符作为输入,多了不要!
* 表示对应键盘输入的数据不赋给一个变量。只读入,不存进变量,直接扔掉!

#include <cstdio>
int main() {
    int age;
    float score;
    char name[20];
    
    printf("请输入姓名、年龄、成绩:");
    scanf("%s %d %f", name, &age, &score); // 注意变量地址(除字符串)
    
    printf("\n格式化输入结果:\n");
    printf("姓名:%s\n", name);
    printf("年龄:%d\n", age);
    printf("成绩:%.1f\n", score);
    
    return 0;
}
        

输入输出示例:


请输入姓名、年龄、成绩:小红 19 88.5

格式化输入结果:
姓名:小红
年龄:19
成绩:88.5
        

五、不同输入输出方式对比

输入输出方式 头文件 使用场景 优点 缺点
单字符I/O(getchar/putchar/cin.get/cout.put) cstdio / iostream 仅需处理单个字符的场景(如字符逐行解析、终端交互) 轻量、高效、无格式转换开销 功能单一,仅支持字符,不支持复杂类型
流式I/O(cin/cout) iostream 常规程序交互、跨平台开发、简单数据输入输出 无需格式符、类型安全、易用性高、支持C++特性(如字符串) 性能略低、格式化控制复杂、输入分隔符限制
格式化I/O(scanf/printf) cstdio 高性能程序、批量数据处理、精准格式控制 性能高、格式控制灵活、兼容C语言、代码简洁 无类型安全、需手动管理格式符、不支持C++字符串(std::string)

六、注意事项

七、总结

本教程全面讲解了C++数据输入输出的核心用法和对比分析,掌握不同I/O方式的特性和适用场景,是编写高效、健壮C++程序的关键。


返回顶部