1 概述

C和C++都没有将输入和输出建立在语言中,C++将输入输出的解决方案放在类库中(由头文件iostream和fstream中定义的类)

C++程序把输入和输出看作字节流。流充当了程序和流源流目标之间的桥梁。

C++输入输出类的派生关系:ios_base -> ios -> istream/ostream -> iostream

cin和cout是对象

2 cout

2.1 <<插入操作符

使用插入操作符可以有一下3种方法:1.一个cout接受的类型(int char long(包括signed/unsigned)float double long double),包括数值/变量/解除引用的指针/数组;2.char数组名或char的指针(必须是char */signed char */unsigned char*而不能是其他类型)3.引号引起的字符串

     int i = ;
int *p = &i;
cout<<*p<<" "<<p<<endl;
char *a = "hellow";
cout<<*a<<" "<<a<<endl;
char name[] = "world";
cout<<name<<endl;

输出结果:

也就是说对于非char类型的指针,必须是cout<<*p,否则cout<<p只是输出p的地址;而char类型的指针,cout<<*p相当于输出p[0],是cout<<p输出p指向字符串的全部内容,原因是cout<<原型中为char类型提供了单独的char指针类型,charl类型的字符串数组也是类似。总而言之对非char类型的指针或数组名正常处理,对于char类型的指针或数组名直接当作内容处理

2.2 拼接输出

<<插入操作符可以拼接,方法也可以拼接,如cout.pur('I').put('T')

2.3 cout.put();cout.write()

put输出字符,接收一个char类型的参数,或者将数值参数转化为char值

write输出字符串,接收两个参数,原型为:

 basic_ostream<charT,traints>& write(const char_type* s, streamsize n);

write遇到空字符时不会停止,即使超出边界,write仍继续打印

    cout.put('A')<<endl;
cout.put('A' + 0x20)<<endl;
cout.put()<<endl;
char *name = "hellow";
char *name1 = "world";
cout.write(name,)<<endl;

2.4 cout格式化值

对于char,数值整型,字符串显示在与其宽度相对应的字段中,对于浮点数,显示为6位(如果够6位),不够的末尾的0也不显示,当指数>=6或<=-5时以科学计数法显示,否则以定点表示法显示

     float i = 1.2;
float j = 1.23456789;
float m = ; //默认精读是6位
float n = 123456.789;
cout<<i<<endl;
cout<<j<<endl;
cout<<m<<endl;
cout<<n<<endl;
cout<<(n * 1e3)<<endl;

最后一行相当于1乘以10的3次方,此时指数大于6,用科学计数法表示

输出十进制:cout<<dec;八进制:cout<<oct;十六进制:cout<<hex    作用域,永久有效直到将格式状态改变为止。

2.5 cout.width();cout.fill();cout.precision()

width()方法有两种原型:

int width();         //返回字符宽度的当前设置

int width(int i);   //设置宽度为i,并返回以前的字符宽度

注意:width方法只影响接下来显示的一个项目,然后将字段宽度恢复为默认值;C++永远不会截短数据,当宽度不够会增加宽度,显示所有数据比保持列整洁更为重要

     int w = cout.width();
cout << "default field width = " << w << ":\n";
for(int i = ;i <= ;i++)
{
cout<<"width:";
cout.width(i);
cout<<i<<endl;
}

由于width()返回以前的宽度,故返回默认的宽度为0,程序表明width()只影响接下来被显示的一个项目

默认情况下用空格填充字段中未被使用的部分,可以用fill()方法来修改填充,比如用*填充写作cout.fill('*'),其作用域一直持续直到更改为止

cout.precision()为设置精度的方法,在默认情况下精度是指的总位数,在定点模式(fixed)和科学模式下精度是指小数点后面的位数,作用域也是一直有效,默认情况下精度是6位

     cout.precision();
float i = 1.2345678;
cout<<i<<endl;
cout<<fixed<<i<<endl;

2.6 cout.setf();cout.setf()以及C++的标准控制符

这类函数可以控制多种格式化特性,前者是用来设置格式,后者用来消除格式,比如:cout.setf(hios_base::showpoint),用来显示末尾小数点,但是这样用比较繁琐,所以C++提供了多个控制符,能够调用setf()

标准控制符直接在插入操作符后面使用,一些常见的标准控制符:

cout<<showbase;  cout<<noshowbase;  对于输出使用/不使用C++前缀

cout<<showpoint; cout<<noshowpoint;  显示/不显示末尾小数点

cout<<showpos;  cout<<unshowpos;        对于正数,显示/不显示 +

cout<<left; cout<<right;                           左对齐/右对齐

cout<<dec; cout<<oct; cout<<hex;           输出十进制/八进制/十六进制

cout<<fixed; cout<<scientific;                   使用定点/科学计数法

2.7 iomanip头文件

主要提供三个函数:setprecision();  设置精度

           setfill();      填充字符

           setw();       设置宽度

比较方便的是可以与cout语句拼接起来

3 cin

3.1 >>抽取操作符

cin>>______ 空格必须是cin接受的类型(int char long(包括signed/unsigned)float double long double),可以是变量,引用,被解除引用的指针,也可以是类或结构体成员

同cout一样也单独针对char类型的指针和数组做出单独的重载,可以直接使用数组名或指针,而对于非char类型的指针则必须要解除引用

     int a;
int *p = &a;
cin>>*p;
cout<<*p<<endl;
char name[];
cin>>name;
cout<<name<<endl;

3.2 cin>>检查输入

读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。输入与预期格式不匹配将导致cin>>结果为false

输入结束条件  :到与目标类型不匹配的第一个字符(比如Enter、Space、Tab键)

对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

3.3 cin.get(); cin.getline();

cin.get(); cin.getline() 都提供不跳过空白的输入

cin.get()常用的有三种原型:cin.get(),  cin.get(char ),  cin.get(char *, int)

单字符输入可以用前两种,ch=cin.get() 与 cin.get(ch)是等价的,输入并显示一段带空格的字符串

     char ch;
while( (ch = cin.get()) != '\n')
cout<<ch;

字符串出入可以用cin.get(char *, int)或是cin.getline(char *, int)

输入结束条件  :读取到指定数目字符或换行符时停止读取

对结束符的处理 :get()将换行符留在输入流中,这样接下来的输入操作首先看到的书换行符,而getline()抽取并丢弃输入流中的换行符,用get()读取字符串时可以用一个cin.get()处理留在输入流中的换行符

     cin.get(array1,);
cin.get();
cin.get(array2,);

cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行

3.4 cin.peek()

返回输入中的下一个字符,但不抽取输入流中的字符,也就是仅查看,不抽取。比如屏蔽空格

 while( cin.peek() == ' ' )
cin.get();

3.5 cin.ignore();cin.read();cin.gcount();

cin.ignore(),接收两个参数,比如:cin.ignore(200,'\n')读取并丢弃输入流中的200个字符或是到达第一个换行符为止

cin.read(),接收两个参数,读取指定数目的字节,并将它们存储在指定的位置中,char gross[144]  cin.read(gross,144),一般与cout.write()一起用

cin.gcount(),返回最后一个非格式化抽取方法读取的字符数,意味着由get(),getline(),ignore(),read()方法读取的字符会被统计,而不是>>

     cout<<"输入一段字符:";
cin.ignore(,'\n');
char num[];
cin.read(num,);
cout<<"抽取的字符数:"<<cin.gcount()<<endl;
cout.write(num,)<<endl;

最新文章

  1. ORA-12520: TNS:listener could not find available handler for requested type of server
  2. Confirm the Ending
  3. UnsupportedClassVersionError 错误解决办法
  4. 帕雷托最优(Pareto optimality)、帕雷托效率(Pareto efficiency)
  5. Linux chkconfig命令
  6. 纯js轮播效果(减速效果)待改进
  7. 第四章 Leader选举算法分析
  8. Block的简单使用
  9. Metro之GridView控件的使用-绑定不同的模板样式显示
  10. Android Phonebook编写联系人UI加载及联系人保存流程(三)
  11. 未来十年的十三条思考(FW)
  12. 用sinopia搭建npm私服
  13. 关于C的一些理解
  14. Windbg调试命令详解(3)
  15. JavaScript 中常用的 正则表达式
  16. (MonoGame从入门到放弃-3)-放弃MonoGame
  17. HBase行锁
  18. 2018-2019-2 网络对抗技术 20165225 Exp5 MSF基础应用
  19. [luogu P3806] 【模板】点分治1
  20. HTML、CSS知识点,面试开发都会需要--No.7 数据列表

热门文章

  1. mybatis中的resultMap与resultType、parameterMap与 parameterType的区别
  2. shared_ptr &amp; unique_ptr &amp; weak_ptr (C++11)
  3. vmvare安装ubuntu后
  4. 58到家mysql数据库军规及解读分享
  5. eclipse插件大全(官方)
  6. HTML5标签的兼容处理
  7. NOIP模拟赛8
  8. C11线程管理:条件变量
  9. CSS属性的私有前缀
  10. ELK 企业内部日志分析系统