c++(3`I/O库)
I/O库
输入和输出并不是C++语言中的正式组成成分,而是在c++ std(Standard Library标准库)中的io库中定义的:
流(stream):
描述字节序列在设备和内存流动的现象
输入输出:
如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,是输入操作
如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),是输出操作
流运算符
流提取运算符’»‘用于从左侧输入流中提取(意味着缓冲区中不存在了)数据 存储到右侧对象中
流插入运算符’«‘用于将右侧对象数据 插入到左侧输出流对象中
输入输出流对象
分类:
- 键盘输入数据,输出到显示器屏幕,称为标准的输入输出流对象
- 磁盘文件间的输入输出,称为文件的输入输出流对象
- 内存中指定的空间进行输入和输出,称为字符串输入输出流对象
标准输入输出流
1
#include <iostream>
展开
std::istream:标准输入流类
std::ostream:标准输出流类
std::iostream:标准输入输出流类
std::cin 标准输入流对象:用于从标准输入读取数据
std::cout 标准输出流对象: 用于将数据输出到标准输出
std::cerr: 标准错误流对象: 用于输出错误信息
std::clog: 标准日志流对象: 用于输出日志信息
常见形式:
1
2
3
4
5
6
7
int x;
std::cin >> x;//从左往右理解
getline(cin, line);
int a, b;
while (cin >> a >> b) {
}
std::cout << "The answer is " << 42 << std::endl;//从右往左理解
展开
endl
- 换行:在输出流里插入一个换行符’\n’
- 刷新缓冲区:将输出缓冲区里的内容立即输出到目标设备
用户输入与cin
分隔符:
- 用户输入字符串后,以空格、tab或换行(可以理解为仅间隔大小不同)作为每个数据的分隔符
- cin读取用户时,会忽略前导的空白字符,直到遇到非空白字符开始读取,然后在遇到下一个空白字符时停止读取
推送:
- 按下回车,首先会将字符串送入到标准输入缓冲区,然后(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算,
- :» 从cin读取数据,本质上是从标准输入缓冲区(临时内存)读取
- 其实用户输入:a[回车]11[回车]5.56[回车] == a[空格]11[空格]5.56[空格][回车],因为都是3个数据被存放到缓冲区
输入个数:
- 输入不足:cin 会等待用户继续输入,直到满足需要的数据个数(每出现»个数++,每»提取后个数–)
- 输入过多:多余的数据会留在输入缓冲区中,供后续的 cin 使用
对while理解:
会循环接受用户输入,直到条件为假
- 用户输入了n个数据后,while 条件为真,执行循环体后再次等待用户输入(遵守输入不足/过多情况)
- 按下 Ctrl+D(Linux/Mac)或 Ctrl+Z(Windows),cin 会检测到文件结束符(EOF),while 条件为假,循环结束
- 如果用户输入的是无效输入(类型不正确),cin 会进入错误状态,while 条件为假,循环结束
其他读取方法:
1
2
3
4
char name[256];
cin.getline(name, 256);
string name1;
getline(cin, name1);
展开
- getline 会从输入流中读取整行内容,直到遇到换行符为止,并将换行符从缓冲区中移除,将结果存储到字符串
输出精度
1
2
3
4
#include <iomanip>
int curRes = 10, curCount = 3;
double average = static_cast<double>(curRes) / curCount;
cout << fixed << setprecision(2) << average << endl;//保留两位小数
展开
acm模式:
- 头文件,用到哪个库要预处理指令包含进来
- 数据读取,用户一定会按照示例输入的方式输入,正常读取就好
- 结果输出,用cout输出结果
文件输入输出流
1
#include <fstream>
展开
std::ifstream:文件输入流类
std::ofstream:文件输出流类
std::fstream:文件输入输出流类
常见形式:
说标准输入输出流通常使用自带的cin、count对象,而文件输入输出流通常要自己构建流对象,然后调用类函数
1
2
3
std::ofstream outFile("example.txt");
is_open()//是否打开
close()//关闭
展开
字符串输入输出流
1
#include <sstream>
展开
std::istringstream:字符串输入流类
std::ostringstream:字符串输出流类
std::stringstream:字符串输入输出流类
本文由作者按照 CC BY 4.0 进行授权