1、输入输出流
(1)cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout
流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区),注意如果插入一个’\n’,则只输出数据和换行,而不刷新out流;
(2)cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出;
(3)使用控制符控制输出格式:
控制符 | 作用 |
dec | 设置整数的基数为10 |
hex | 设置整数的基数为16 |
oct | 设置整数的基数为8 |
setbase(n) | 设置整数的基数为n(n只能是16,10,8之一) |
setfill(c) | 设置填充字符c,c可以是字符常量或字符变量 |
setprecision(n) | 设置实数的精度为n位。在以一般十进制小数形式输出时,n代表有效数字。在以fixed(固定小数位数)形式和scientific(指数)形式输出时,n为小数位数。 |
setw(n) | 设置字段宽度为n位。 |
setiosflags(ios::fixed) | 设置浮点数以固定的小数位数显示。 |
setiosflags(ios::scientific) | 设置浮点数以科学计数法(即指数形式)显示。 |
setiosflags(ios::left) | 输出数据左对齐。 |
setiosflags(ios::right) | 输出数据右对齐。 |
setiosflags(ios::shipws) | 忽略前导的空格。 |
setiosflags(ios::uppercase) | 在以科学计数法输出E和十六进制输出字母X时,以大写表示。 |
setiosflags(ios::showpos) | 输出正数时,给出“+”号。 |
resetiosflags | 终止已设置的输出格式状态,在括号中应指定内容。 |
(4)用流对象的成员控制输出格式
流成员函数 | 与之作用相同的控制符 | 作用 |
precision(n) | setprecision(n) | 设置实数的精度为n位。 |
width(n) | setw(n) | 设置字段宽度为n位。 |
fill(c) | setfill(c) | 设置填充字符c。 |
setf( ) | setiosflags( ) | 设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同。 |
ubsetf( ) | resetiosflags( ) | 终止已设置的输出格式状态。 |
(5)设置格式状态的格式标志
格式标志 | 作用 |
ios::left | 输出数据在本域宽范围内左对齐 |
ios::right | 输出数据在本域宽范围内右对齐 |
ios::internal | 数值的符号位在域宽内左对齐,数值右对齐,中间由填充字符填充 |
ios::dec | 设置整数的基数为10 |
ios::oct | 设置整数的基数为8 |
ios::hex | 设置整数的基数为16 |
ios::showbase | 强制输出整数的基数(八进制以0打头,十六进制以0x打头) |
ios::showpoint | 强制输出浮点数的小点和尾数0 |
ios::uppercase | 在以科学计数法输出E和十六进制输出字母X时,以大写表示 |
ios::showpos | 输出正数时,给出“+”号。 |
ios::scientific | 设置浮点数以科学计数法(即指数形式)显示 |
ios::fixed | 设置浮点数以固定的小数位数显示 |
ios::unitbuf | 每次输出后刷新所有流 |
ios::stdio | 每次输出后清除stdout,stderr |
(6)文件操作的一个示例
1>ASCII文件操作
#include <fstream>
#include<iostream>
using namespace std;
int main( )
{int a[10];
ofstream outfile("f1.dat",ios::out); //定义文件流对象,打开磁盘文件"f1.dat"
if(!outfile) //如果打开失败,outfile返回值
{cerr<<"open error!"<<endl;
exit(1);
}
cout<<"enter 10 integer numbers:"<<endl;
for(int i=0;i<10;i++)
{cin>>a[i];
outfile<<a[i]<<" ";} //向磁盘文件"f1.dat"输出数据
outfile.close(); //关闭磁盘文件"f1.dat"
return 0;
}
2>二进制文件操作
#include <fstream>
#include<iostream>
using namespace std;
struct student
{string name;
int num;
int age;
char sex;
};
int main( )
{student stud[3];
int i;
ifstream infile("stud.dat",ios::binary);
if(!infile)
{cerr<<"open error!"<<endl;
abort( );
}
for(i=0;i<3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close( );
for(i=0;i<3;i++)
{cout<<"NO."<<i+1<<endl;
cout<<"name:"<<stud[i].name<<endl;
cout<<"num:"<<stud[i].num<<endl;;
cout<<"age:"<<stud[i].age<<endl;
cout<<"sex:"<<stud[i].sex<<endl<<endl;
}
return 0;
}
(7)字符串流示例
#include <strstream>
using namespace std;
int main( )
{char c[50]="12 34 65 -23 -32 33 61 99 321 32";
int a[10],i,j,t;
cout<<"array c:"<<c<<endl;//显示字符数组中的字符串
istrstream strin(c,sizeof(c)); //建立输入串流对象strin并与字符数组c关联
for(i=0;i<10;i++)
strin>>a[i]; //从字符数组c读入个整数赋给整型数组a
cout<<"array a:";
for(i=0;i<10;i++)
cout<<a[i]<<" "; //显示整型数组a各元素
cout<<endl;
for(i=0;i<9;i++) //用起泡法对数组a排序
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
ostrstream strout(c,sizeof(c)); //建立输出串流对象strout并与字符数组c关联
for(i=0;i<10;i++)
strout<<a[i]<<" "; //将个整数存放在字符数组c
strout<<ends; //加入'\\0'
cout<<"array c:"<<c<<endl; //显示字符数组c
return 0;
}
2、C++工具
(1) 异常处理:检查(try),抛出(throw),捕捉(catch)
throw语句一般是由throw运算符和一个数据组成的,其形式为
throw 表达式;
try-catch的结构为
try
{被检查的语句}
catch(异常信息类型[变量名])
{进行异常处理的语句}
(2) 命名空间
如:
namespace ns1//声明命名空间ns1
{class Student //在命名空间ns1内声明Student类
{public:
Student(int n,string nam,int a)
{num=n;name=nam;age=a;}
void get_data( );
private:
int num;
string name;
int age;
};
void Student::get_data() //定义成员函数
{cout<<num<<″″<<name<<″″<<age<<endl;
}
double fun(double a,double b) //在命名空间ns1内定义fun函数
{return sqrt(a+b);}
}(没有分号)
用法与定义与类相似