1. c++输入输出对象
- 标准I/O(设备):对系统指定的标准设备输入输出,如键盘、显示器
- 文件I/O(文件):对磁盘文件为对象进行输入输出
- 串I/O(内存):对内存中指定空间输入输出
2. c++为什么不沿用c语言的printf和scanf
c语言中的printf和scanf不能保证输入输出的数据可靠性与安全性,编译系统不对数据的合法性进行检查,如scanf不小心漏掉&
,如不小心用格式符%d
输出字符串:
printf("%d","hello"); //会输出字符串的首地址
并且c语言的的I/O只能输出标准类型,无法输出用户自己声明的类型,如数组、结构体、类等。c++的iostream一个重要特性就是其高可拓展性
3.c++的格式控制符
c++格式控制符是在iomanip头文件上定义的
//控制符控制
int a = 17;
cout << "dec:" << dec << a << endl; //十进制
cout << "hex:" << hex << a << endl; //十六进制
cout << "oct:" << setbase(8)<< a << endl; //八进制
char *pt = "china";
cout << setfill('*')<<setw(10) << pt << endl; //'*'填充,宽度为10
double pi = 22.0 / 7.0;
cout << setiosflags(ios::scientific) << setprecision(8); //科学计数法,小数点位数为8
cout << "pi=" << pi << endl;
cout << "pi=" << resetiosflags(ios::fixed) << setprecision(4) << pi << endl; //小数形式输出,4为小数
/*输出:
dec:17
hex:11
oct:21
*****china
pi=3.14285714e+000
pi=3.1429e+000
*/
//流控制
cout.setf(ios::showbase);//显示进制,默认十进制
cout << "dec:" << a << endl;
cout.unsetf(ios::dec);//终止十进制
cout.setf(ios::hex);//设置十六进制
cout << "hex:" << a << endl;
//cout.width(10);
//cout.fill('*');
//cout.setf()常用输入:iso::uppercase,大写输出;iso::showpos,输出正数显示+号;
说明:
width(n)只对第一个输出有效;
setiosflags(ios::scientific)后在设置
setiosflags(ios::fixed)输出十六进制数
0x1.9249p+1,原因是流格式化设置并不像按钮一样,新的设置会自动覆盖原先的设置,这里要使用
resetiosflags()重置才行,或者用set(fmt,mask)。
4.输入输出缓存区
缓冲区是用作中介的内存块,主要作用是提高处理输入输出的效率,原因在于像磁盘驱动器这样的设备通常是以512字节的块为单位来传输信息,而程序每次只能处理一个字节.所以通过缓冲的方法,一次从磁盘读取大量的信息存储到缓冲区,程序再从缓冲区中每次读取一个字节,因为从内存中读取一个字节的时间要远小于从磁盘读取的时间。
streambuf类为缓冲区提供内存并提供了填充缓冲区,访问缓冲区,刷新缓冲区,管理缓冲区等方法。
缓冲flush时,里面所有数据被写入或者被抹掉,这个过程叫同步,它会发生在一下情况:
- 程序正常结束。作为main返回工作的一部分,将清空所有的输出缓冲区。
- 缓冲区满时,需要刷新缓冲区,而后数据才可以写进缓冲区。
- 用操纵符显示地刷新缓冲区,如用endl。
- 在每次输出操作执行完毕后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。
- 可将输出流与输入流关联起来,在读输入流时将刷新其关联的输出缓冲区。
#4. 文件流
头文件fstream定义了三个类型来支持文件IO:ifstream从文件读取;ofstream从文件写入数据;fstream可以读写给定文件。
我们读写文件时,可以定义一个文件流对象,然后和文件关联,每个流都定义了open()成员函数,来定位给定文件。`````
ifstream in(ifile);//打开文件ifile
ofstream out;//未关联
in.close();//关闭
out.open(ifile+".copy"); //打开指定文件
文件打开模式:
文件模式 | 解释 |
---|---|
in | 以读方式打开 |
out | 以写的方式打开(会丢失已有数据) |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位到末尾 |
trunc | 截断文件 |
binary | 二进制方式IO |