前言
一直以来都没怎么关注算法(好麻烦的样子),但最近必须要准备研究生复试(机试)和找工作,所以不得不硬着头皮开始怼,奈何相关基础薄弱,leetcode
刷一题得找好多相关资料,权衡再三,便决定从基础学起(不知道晚不晚),考虑到近期的任务需要,最终选择C++
作为算法编程语言。本文主要总结了C++
的常用输入输出以及其他常用函数的用法。
缓冲区
C++
的缓冲区与《操作系统》的相关概念一致,本质上是一块内存区域,它用在IO设备和CPU之间,用来缓存数据。缓冲区的存取速度一般比CPU慢但又比IO设备快,因此用于低速的IO设备和高速的CPU之间协调它们的速度差异,避免低速的IO设备大量占用CPU资源,使其能够高效率工作(归根结底只为压榨CPU性能,很多计算机技术都是如此)。
iostream
cin
- cin»
等价于cin.operator>>()
,以空格、制表符、换行符(以下简称分隔符)作为分隔符从缓冲区读取对应类型的数据。如果缓冲区中第一个字符是分隔符时,cin>>
会将其忽略并清除,继续读取下一个字符;如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>
不做处理;如果缓冲区为空,则继续等待;
- cin.get()
cin>>
无法满足所有场景下的输入需求,比如不能使用 >>
运算符读取/判定分隔符,cin.get()
便能很好的解决此类问题,其主要方法如下:
方法 |
解释 |
返回值 |
int cin.get() |
读取一个字符并返回 |
成功:返回读取字符的ASCII 码值;遇到文件结束符时,返回EOF,即-1,Windows下标准输入输入文件结束符为Ctrl+z ,Linux为Ctrl+d |
istream& cin.get(char& var) |
读取一个字符至var |
返回的是istream 对象,因此可以支持链式操作(cin.get(b).get(c) ) |
istream& cin.get(char* buf, int n ) |
读入字符到buf 数组中,直至读取n个字符或换行符停止 |
同上 |
istream& cin.get(char* buf, int n, char delim = '\n') |
读入字符到buf 数组中,直至读取n个字符或delim 指定的字符停止 |
同上 |
示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int main(){
int n,sum = 0;
char ch[10];
cin>>ch; // fantasy
cout<<ch; // fantasy
cin.get(ch[0]); // fantasy
cout<<ch; // f
cin.get(ch,5); // fantasy
cout<<ch; // fant
cin.get(ch,10,'s'); // fantasy
cout<<ch; // fanta
return 0;
}
|
- cin.getline()
方法 |
解释 |
返回值 |
cin.getline(char* buf, int n) |
读入字符到buf 数组中,直至读取n个字符或换行符停止 |
istream 对象 |
cin.getline(char* buf, int n, char delim) |
读入字符到buf 数组中,直至读取n个字符或delim 指定的字符停止 |
同上 |
注意:cin.getline()
当输入超过buf
长度时,多余的字符将被丢弃;cin.getline
与cin.get
的区别是:cin.getline
不会将分隔符残留在输入缓冲区中
- 其他相关函数
方法 |
解释 |
备注 |
cin.ignore(int n=1, char delim = EOF) |
抛弃输入流中的数据,直至抛弃n个或遇到delim 指定的字符(delim 本身也被抛弃) |
用于清除缓冲区内容 |
istream& getline(istream input, char *buf, char delim = '\n') |
从输入流input 读入字符到buf 数组中,直至读取到delim 指定的字符停止 |
无 |
istream& gets(char *buf) |
将所有输入流的数据读入buf 数组中 |
可能发生溢出 |
cout
方法 |
解释 |
cout<<endl |
完成换行并刷新缓冲区 |
cout<<flush |
直接刷新缓冲区 |
cout<<unitbuf |
设置这个cout输出流在接下来的每次操作之后都自动刷新缓冲区 |
cout<<nounitbuf |
让cout回到默认的缓冲设置 |
常用场景
- 输入多组(未知数量)数据并处理
1
2
3
4
|
int a,b;
while(cin>>a&&cin>>b){
cout<<a+b<<endl;
}
|
- 读取并计算一组以换行符结束的数据(位置数量)的和
1
2
3
4
5
|
while(true){
sum += n;
if(cin.get() == '\n') break;
cin>>n;
}
|
其他函数
system("pause")
发起系统命令行调用,暂停屏幕,一般用于查看执行结果
总结
之前学过C++
,但平常一直在用Java
和Python
,以至于连最基本的C++
函数都忘了,以后要常用,并会将遇到的相关I/O
问题及时更新至本文。