Skip to content
On this page

输入输出

c++是c语言的进化,所以可以使用c语言的输入输出函数scanfprintf,当然c++也有它特有的输入输出方法cincout

下面的我们来具体看一下如何输入输出数据

c风格读取代码:

  • 输入输出时要指定标记(%d %f %lf
  • 速度快
  • 读取数字的时候会略过不可见字符(空格,换行符)

c++风格读取代码:

  • 开启IO不与c同步优化后,快!
  • 读取的时候简单,不用记指定的标记
  • 格式化输出的时候要写的字多,记的东西多,。
  • 在对一些格式化的输出的时间不太好用,例如输出:number is %8d \n\n,hello world,但在真实比赛中很少用到

关闭同步的方式:

cpp
std::ios::sync_with_stdio(false);
cin.tie(0); //来解除std::cin和std::cout之间的绑定,提高效率。
1
2

c++11以上的语言可以使用如下的匿名函数(Lambda捕获)

cpp
static auto _=[]()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    return 0;
}();
1
2
3
4
5
6

读取字符

无论哪种方法读取数字时都会略过不可见字符(空格,换行符),注意

  • 如果使用cin读取字符的时候略过不可见字符
  • 如果使用scanf读取字符的时候不会略过不可见字符
plaintext
abc 123 8
newline
hello world
1
2
3

c++风格

cpp
#include <iostream>
using namespace std;

int main(){
    while ( 1 ) {       //无限循环
        char c;
        cin >> c;
        cout << "read char is " << c << endl;
    }
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12

c风格

cpp
#include <cstdio>

int main(){
    while ( 1 ) {       //无限循环
        char c;
        scanf("%c",&c);
        printf("read char is %c\n",c);
    }
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11

读取数字

无论哪种方法(cin,scanf)读取数字时都会略过不可见字符(空格,换行符)

plaintext
1 1.1 2.0
3
4
5
1
2
3
4
cpp
#include <iostream>
using namespace std;
int main(){
    int a; //定义一个整型变量a
    double b,c;
    int x,y,z;
    cin >> a >> b >>c; //都写一行太长了,所以换一行写
    cin >> x >> y >> z;
    //每个数占一行
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
    cout << x << endl;
    cout << y << endl;
    cout << z << endl;
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

c风格数字读取,需要指明要读取的数字的类型(%d,%c,%f等)

cpp
#include <cstdio>

int main(){
    int a; //定义一个整型变量a
    double b,c;
    int x,y,z;
    scanf("%d",&a);
    scanf("%lf%lf",&b,&c);// %lf表示要读取一个double类型的数
    scanf("%d%d%d",&x,&y,&z); // %d表示读取整数
    printf("%d %lf %lf\n",a,b,c); // 输出: 1 1.100000 2.000000
    printf("%d %d %d",x,y,z); //输出: 3 4 5
    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

cout格式化输出

  • 进制相关

    • std::hex 16进制显示
    • std::oct 8进制显示
    • std::dec 10进制显示
  • 精度相关

    • std::defaultfloat 默认显示,有几位显示几个小数
    • std::fixed 表示浮点输出应该以固定点或小数点表示法显示,而不是以科学记数字法

    fixed 操作符与 setprecision 操作符一起使用时,setprecision 指定浮点数字的小数点后要显示的位数,而不是要显示的总有效数位数。

    • std::setprecision(n)
  • 宽度相关

    • std::setw() 指定宽度
    • std::fill(char) 指定填充的字符
cpp
/* author: Rainboy email: rainboylvx@qq.com  time: 2021年 04月 22日 星期四 20:52:19 CST */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5,maxe = 1e6+5; //点与边的数量

int n,m;
/* 定义全局变量 */

int main(){
    int a = 7 ,b = 12,c = 16;
    cout << a <<" "<< b <<" "<< c << endl;
    cout << hex << a <<" "<< b <<" "<< c << endl;
    cout << oct << a <<" "<< b <<" "<< c << endl;
    cout << dec << a <<" "<< b <<" "<< c << endl;

    cout << setw(5) << a << endl;
    cout << setw(10) << b << endl;
    cout << setw(10) << setfill('!')<< b ;

    double d = 0.1234567;
    cout << d << endl;
    cout << fixed << setprecision(4) << d << endl; //四舍五入
    //cout << setprecision(4) << d << endl; //不用fixed
    cout << d << endl;
    cout << setprecision(3) ;
    cout << d << endl;

    cout << setprecision(10) << d << endl; //10位

    cout << defaultfloat << d << endl;

    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

printf格式化输出

  • 进制相关
    • %x 16进制显示
    • %o 8进制显示
    • %d 10进制显示
  • 精度相关
    • %.8lf double类型浮点数,保留8位小数,四舍五入
    • %.8f float类型浮点数,保留8位小数,四舍五入
  • 宽度相关
    • printf("%4d",12), 4个宽度输出,右对齐
    • printf("%04d",12), 4个宽度输出,右对齐,用0补全
    • printf("%-4d",12), 4个宽度输出,左对齐
cpp
#include <bits/stdc++.h>

int main(){
    int a = 7 ,b = 12,c = 16;
    printf("%d %d %d\n",a,b,c); //输出 "7 12 16" 然后换行
    printf("%x %x %x\n",a,b,c); //16进制输出
    printf("%o %o %o\n",a,b,c); //8进制输出

    printf("%5d\n",5); //5个位置,用来输出5
    printf("%10d\n",5);//10个位置,用来输出5,右对齐
    printf("%-10d\n",5);//10个位置,用来输出5,左对齐
    printf("%010d\n",5);

    return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16