c++ IO流---输入输出流 & 格式控制字符

流:若干字节数据从一端到另一端我们叫做流

例:操作文件,从程序到文件,数据的流动的操作称为流操作

流类体系

专门处理输入输出流、字符流、文件流,包含有:

  • 流对象

  • 流运算符 >>  <<

输入&输出流对象 + 流运算符 >>  <<    处理输入输出的数据

字符流对象 + 流运算符 >>   <<        处理字符流

文件的对象 + 流运算符 >>  <<              读写文件

基本输入、输出流

istream 类---cin       输入

ostream类---cout     输出

输出流除了cout外,还有一些别的对象(效果和cout一样)

  • cerr ---标准出错

  • clog ---日志文件输出

void testostream()     //output 
{
	cout << "标准输出" << endl;		//cin & cout都可以重定向
	cerr << "标准错误输出" << endl;	//觉得程序可能出错时用cerr输出标识作用 不能重定向 
	clog << "日志文件输出" << endl;  //可以重定向为文件
}
int main(){

    testostream();
}
/*输出*/

标准输出
标准错误输出
日志文件输出

freopen(重定向)

可以把程序的输入、输出重定向为文件

重定向是文件中的数据的格式要与程序读取的格式一致

输入重定向

int main()
{
    freopen("1.txt","r",stdin); //参数:文件名 读写方式:写 流
    int a,b;
    scanf("%d%d",&a,&b);        //把基本输入定向为文件,程序所有的输入由文件1.txt完成
    cout << a + b << endl;      //数据在文件中的格式要和程序读取的格式一致
}

/*输出*/

在 1.txt 输入1 2 
3 

输出重定向

int main()
{
    freopen("1.txt","r",stdin);
    int a,b;
    scanf("%d%d",&a,&b);       
    freopen("2.text","w",stdout);
    printf("%d",a+b);

}
/*输出*/

在 2.txt 中输出3 

字符类的处理

  • 正常的操作

  • 通过IO流对象调用成员函数的方式

单个字符 & 多个字符 & 字符串的输出处理

//通过IO流对象调用成员函数的方式 传常量&变量都可以
void testostream()    
{
//单个字符的输出
    cout.put('a');          //传常量    通过IO流对象调用成员函数的方式
	cout << 'a' << endl;    //正常的输出方式也可以

	char c = 'C';
	cout.put(c);            //传变量
	cout << c << endl;
//多个字符|字符串的输出
	cout.write("ILoveyou",4);/*写入输出 后面的参数:指定长度输出,超过长度的部分不做 
                               输出 截取输出没有'\0' 截取了前面4位*/
}
int main()
{
    testostream();
}
/*输出*/

aa
CC
ILov

单个字符&多个字符&字符串的输入处理

void testostream()
{
//单个字符的输入
	/*  char c;
		c=cin.get();
		cout.put(c);          用中间变量接收返回值,再做输出*/
	cout.put(cin.get());    //要处理回车
	cout << endl;

//多个字符/字符串的输入
	cout << "字符串的处理"<

注意不能用来处理string

 string text;
 cin.getline(text,20);    //报错:不能处理string,只能处理char*

格式控制字符

  • 包含头文件

  • 常用的格式控制:一种是调用成员函数方式,一种是流控制字符去做

    • 设置有效位数: setprecision(n),不是指设置小数位是n位

    • 设置精度: fixed 结合 setprecision 使用

流控制字符 - - - c++用来控制格式的操作

设置格式

int main()
{
	double pi = 34.12343;
	cout << "设置有效位数是:" << setprecision(4) << pi << endl;     //从整数位开始算
	cout << "有效小数位:" << fixed << setprecision(4) << pi << endl;//从小数位开始算

//所有的流控制字符都会对应一个成员函数的方式
	cout.precision(4); 
	cout << "有效小数位:" << pi; /*设置完流格式不一定要立即输出,
                                   可以缓慢输出(在下一行输出)*/

	double pi = 34.12369;
	cout << "设置有效位数是:" << setprecision(4) << pi << endl;
	cout << "有效小数位:" << fixed << setprecision(4) << pi << endl;
	cout.precision(4); //所有的流控制符都会对应一个成员函数的方式
	cout << "有效小数位:" << pi;
}
/*输出   四舍五入 */

设置有效位数是:34.12    //从最大的整数部分开始算 没有包含小数点
有效小数位:34.1234      //结合fixed使用设置有效小数位
有效小数位:34.1234 

设置有效位数是:34.12
有效小数位:34.1237
有效小数位:34.1237       

 进制输出

int main()
{
	cout << hex << 32 << endl;         //16进制
	cout << oct << 15 << endl;         //8进制输出
//流控制字符的方式,不能是任意进制,任意进制的默认10进制输出
	cout << setbase(2) << 7 << endl;   //2进制无效
	
}
/*输出*/

20
17
7

 对齐方式和数据的宽度问题        制表符 ' \t '

  • setw():设置输出数据的宽度

  • 限制每个数据的位数不足补空格 

  • 8位制表,不足8位  补空格    

  • 超过8位,按照16位制表

//默认右对齐
int main()
{
   cout << setw(8) << "123" << setw(8) << "12344" << setw(8) << "3444" << endl;
//ios::right右对齐 ios::left左对齐 数据不够用空格占位
   cout << setiosflags(ios::left);
   cout << setw(8) << "123" << setw(8) << "12344" << setw(8) << "3444" << endl;
   cout.width(8);
   cout<<"123"<<"123"<<"666";    //调用成员函数的方式,只能管一个制表

    
}
/*输出*/

     123   12344    3444 //默认是右对齐方式
123     12344   3444

123     123666

你可能感兴趣的:(C++,c++)