语法基础 - io - 基本输入输出

说明

  • 输入操作:字节数据从设备(如键盘、磁盘驱动器、网络连接等)流向内存。
  • 输出操作:字节数据从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等)。

C/C++对比

  • C++采用字节序列流的方式,相对于C语言,流的方式更通用,但是性能会差点。
  1. 通用:不同于C语言,数据类型基本上是固定的,C++可以自定义类,当输出类类型时,例如:输出string类型数据,使用c方式printf你不知道该使用%s,还是其它格式,其它自定义类型更无法逐一定义。
  2. 性能下降的原因:C/C++都是通过封装系统接口实现的,为了实现通用需要浪费一定性能,通过测试可以得知。

基本输入

  • 不同于基本输出(各种数据类型转换成字节数据),基本输入是字节数据转换成各种数据类型,转换的类型有多种,处理也不同,如下:
  1. 输入变量
  2. 输入一行字符串
  3. 输入原始数据

输入变量

  • 为了将多个输入变量间隔开来,需要定义一些间隔符和一些异常处理,如下:
  1. 空格(Space)、回车(Enter)、跳格(Tab)键。
  2. 宽度限制导致结束。
  3. 非法输入。
  • 输入字符串,采用输入变量的方式,可能会出现不符合预期的情况,例如:
* C++
string str;
std::cin >> str;
std::cout << str;
* C
char a[20];
scanf("%s",a);
printf("%s",a);

输入 I Love You!
输出 I
* 原因正是:按变量输入,程序无法区分处理,字符串空格和变量间隔符。

输入一行字符串

  • 按字符串方式处理,程序默认以回车(Enter)为间隔符。
  • 使用如下:
* C++ std::cin
istream & getline(char* buf, int bufSize);
istream & getline(char* buf, int bufSize, char delim);

std::cin.getline(数组名,长度,结束符)
1. 会丢弃缓冲区中的结束字符
2. 数组名:被输入的对象,只能使用Cstring,不支持string类对象

* C
char cmd[100];
gets(cmd)  //可能导致栈溢出
fgets(cmd,100,stdin); //至多读取100 - 1个字符

输入原始数据

  • 按字节输入,不需要间隔符,因此不会丢弃任何数据。
  • 使用如下:
* C++
std::cin.get(数组名,长度,结束符)
1. 数组名:被输入的对象,只能使用Cstring,不支持string类对象
2. 长度:希望从输入缓冲区中读取多少字符
3. 结束符:输入遇到哪一个字符结束输入,默认是换行符(enter),可以设置成空格键
特点:
1. 读入的字符个数最多是(长度 - 1)
2. 对结束符的处理是不丢弃缓冲区的结束符enter,可能会对下一次的输入造成影响
3. 被输入对象只能是C风格的字符串,不支持C++风格字符串

基本输出

  1. 标准输出流: std::cout
  2. 标准错误流: std::cerr
  3. 标准日志流: std::clog
相关头文件说明
该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流
该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。
  • 基本使用
std::cerr << "Error message : " << str << endl;
* std::cout, std::clog 类似。
  • 区别
  1. std::cout和std::clog是有缓存的,而std::cerr没有。

输出和格式控制

  • 打印 bool 类型变量
#include <iostream>
using std::boolalpha;
cout << boolalpha << false; // 输出true或者false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值