C++
- 知识基础
- 流操作符
- 类 & 基础
- 初始化和重载
- 类 & 高级
- 继承和多态
- 模板 & 标准模板库STL
了解最C++最基本的输入输出,熟悉使用方法,虽然兼容C语言,但是C++的使用方法能帮助我们理解面向对象的基础!
一、流操作符
1.基本介绍
操作符 | 说明 |
---|---|
>> | 流提取操作符 |
<< | 流插入操作符 |
我们在C语言中已经提及过流的概念,对于各种数据向指定目标读写,提及过缓冲区的概念;类似的,在C++中我们定义了一些对象(读写的目标),定义好了对这些对象读写的方式,可以使用流操作符直接实现对流对象的读写。
最一般的iostream
、fstream
对应控制台输入输出流和文件操作流;还有sstream
字符串操作流。
本质上是封装了C语言中各类输入输出函数(不论是对控制台的还是文件的),通过统一的操作符实现,方便我们的使用;使用时要声明相应的头文件;
#include<iostream>
using namespace std;
#include<fstream>
#include<sstream>
流操作符的左部是操作对象,右部是数据变量,操作符方向指明了数据流动的方向,写入数据变量或者读取数据变量到对象之中。
流操作中流动的数据本质上是文本字符,流操作符会完成各种基本类型到字符串类型的转换
2.格式化控制
以字符串形式的流操作就一定会存在格式化控制,在C++中可以通过一些格式化函数控制流中的文本格式:
头文件 #include<iomanip>
-
默认
域宽确定;
输出精度,浮点型有效位6位,
右对齐,无填充。 -
setw(val)
操作符 | 说明 |
---|---|
对象>>setw(val)>>a | 指定输入的域宽,从对象读出时最多只提取val位 |
对象<<setw(val)<<a | 指定输出的域宽,a在对象中的存在至少占val位,超过不截断 |
只对相邻的一项有效
setprecision(val)
操作符 | 说明 |
---|---|
对象<<setprecision(val)<<a | 指定输出的有效位数,指定的太大则规定失效 |
对指定之后的所有数据生效
setiosflags(状态标志)
状态标志 | 说明 |
---|---|
ios::left | 左对齐,右边填充空格 |
ios::right | 右对齐,左边填充空格,默认 |
ios::fixed | 以定点形式输出浮点数 |
ios::scientific | 以科学计数法输出浮点数 |
ios::dec | 随后输出的所有整数为十进制 |
ios::hex | 随后输出的所有整数为十六进制 |
ios::oct | 随后输出的所有整数为八进制 |
ios::showpoint | 输出小数点和尾部的零 |
ios::showpos | 输出正数前的+ |
ios::uppercase | 十六进制使用大写字母输出 |
二、简单输入输出
流操作符最常用的操作自然是向控制台的输入和输出,在#include<iostream>
中我们定义了标准输入输出类,并定义好了实例cin
、cout
,关于类的知识我们在下一节讲解,这里我们简单了解用法就好;
1.cout
对象
配合<<
使用,是ostream类的一个实例,表示数据流向控制台,写在命令窗口上,作为一个封装好的实例,ostream类包含了一些定义好的成员函数,同样能够实现格式化控制输出。
在输出之前设置
- cout.width(val);
- cout.precision(val);
- cout.setf(flag);
- cout.unsetf(flag);
2.cin
对象
配合>>
使用,是istream类的一个实例,表示控制台数据流向变量,除去类似cout的操作,istream定义的成员函数实现了一些对字符串读取:
cin>>a
,以空白字符为间断,跳过所有的空白字符,设置域宽也不能解决空格中断。cin.getline(str, size);
,最多读取size-1大小的一行字符,遇到换行符结束读取,末尾添加\0
。(读取但不存储\n
)cin.get();
,一次读取一个字符,包括空白字符。cin.ignore(n, c);
,控制忽略,cin跳过n个字符或者遇到字符c忽略它;不设参数时忽略当前缓存区的第一个字符;常用来处理>>
之后剩余的换行符!!!
3.操作符
操作符可以直接跟在流操作符之后,表示特定的操作,最常用的的cout<<endl
操作符 | 描述 | 输入 | 输出 |
---|---|---|---|
boolalpha | 启用boolalpha标志 | √ | √ |
dec | 启用dec标志 | √ | √ |
endl | 输出换行标示,并清空缓冲区 | √ | |
ends | 输出空字符 | √ | |
fixed | 启用fixed标志 | √ | |
flush | 清空流 | √ | |
hex | 启用 hex 标志 | √ | √ |
internal | 启用 internal 标志 | √ | |
left | 启用 left 标志 | √ | |
noboolalpha | 关闭boolalpha 标志 | √ | √ |
noshowbase | 关闭showbase 标志 | √ | |
noshowpoint | 关闭showpoint 标志 | √ | |
noshowpos | 关闭showpos 标志 | √ | |
noskipws | 关闭skipws 标志 | √ | |
nounitbuf | 关闭unitbuf 标志 | √ | |
nouppercase | 关闭uppercase 标志 | √ | |
oct | 启用 oct 标志 | √ | √ |
right | 启用 right 标志 | √ | |
scientific | 启用 scientific 标志 | √ | |
showbase | 启用 showbase 标志 | √ | |
showpoint | 启用 showpoint 标志 | √ | |
showpos | 启用 showpos 标志 | √ | |
skipws | 启用 skipws 标志 | √ | |
unitbuf | 启用 unitbuf 标志 | √ | |
uppercase | 启用 uppercase 标志 | √ | |
ws | 跳过所有前导空白字符 | √ |
三、文件输入输出
类似的,在#include<fstream>
中定义了文件流类型,不同于控制台流的是,并不存在标准流,所以我们需要在程序中自己定义文件流类的实例;
到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。
定义了三个新的数据类型:
数据类型 | 描述 |
---|---|
ofstream | 该数据类型表示输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 该数据类型表示输入文件流,用于从文件读取信息。 |
fstream | 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。 |
#include<iostream>
using namespace std;
#include<fstream>
int main(){
ofstream file;
}
1.打开关闭文件
cin
这样的实例已经绑定了标准输入,对应的我们也要为文件流绑定对应的文件,最后也要关闭这种绑定,释放资源。在C++中我们定义了成员函数实现这种操作:
file.open(filename, flags)
,可以以不同的权限打开文件。
模式标志 | 描述 |
---|---|
ios::app | 追加模式。所有写入都追加到文件末尾。 |
ios::ate | 文件打开后定位到文件末尾。 |
ios::in | 打开文件用于读取。 |
ios::out | 打开文件用于写入。 |
ios::trunc | 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。 |
file.close()
,关闭相应的文件流!
2.文件读写、状态控制
关于文本文件读写可以直接使用流操作符实现,与向cout
、cin
的操作是完全一致的,这也就体现了我们面向对象的好处!
同样,文件流也定义了成员函数,对于二进制文件的读写要借助于成员函数:
file.write((cahr*)buffer, sizeof(buffer));
之后对文件的写入操作会识别相应的数据类型,以二进制写入。file.read((cahr*)buffer, sizeof(buffer));
之后对文件的读取操作会识别相应的数据类型,读出转化二进制数据存入相应变量。
成员函数 | 含义 |
---|---|
eof() | 到达文件末尾返回非零,否则返回零 |
… | … |
总结
C++的输入输出主要通过库中已经定义的类实现,各种功能通过成员函数来实现,常用的成员函数一定要掌握,其他的在今后学习中慢慢了解即可,我们涉及到的读写控制其实是不多的/(ㄒoㄒ)/~~