C++的输⼊输出超级超级详细讲解
⼀、cin 和 cout
C++相关变量值的输出,使⽤的是 cout,那么在C++中进⾏打印输出⼀般是⽤输⼊与输出流库中的 cin 和 cout 来实现的。
cin 和 cout 的定义是在 iostream 中,命名空间为 std,所以如果我们的程序中要使⽤ cin 和 cout 就必须要加上以下两条语句:
#include<iostream>
using namespace std;
在进⾏输⼊和输出的时候,我们经常使⽤ << 和 >> 符号。例如:cout << “ x+y = ” << 5 << endl;
<< 是流插⼊运算符;>> 是流提取运算符;
所以,cout << “ x+y = ” << 5 << endl; 这句话的意思是将字符串 "x+y = " 先传递给 cout,即:流插⼊,之后再把 常量 5 插⼊到cout,之后 endl 结束。⼤家可以把 << 和 >> 看成是流的⽅向,看往哪个⽅向流,这样能更好理解⼀些。
如果你要输出,那么肯定是要把字符串或者变量什么的传递给 cout 所以箭头要指向 cout,如果你要进⾏输⼊,那么就要从 cin 提取内容赋值给变量:例如:
int x = 0;
cin >> x;
从标准设备输⼊⼀个整形的值给变量 x,这个标准输⼊设备⼀般指键盘。执⾏到这句 cin >> x; 的时候程序会卡住,等待⽤户的输⼊,输⼊完成后继续往下⾛。cin 和 cout 的 >> 和 << 会智能的判断参数的类型,不管是整形还是字符型或者是字符串型,他都可以智能识别并进⾏输⼊与输出操作。
另外,注意,不管是 cin 也好,cout 也好,<< 和 >> ⼀次性只能输出或者输⼊⼀个,例如以下的写法是错误的:
cout << a, b, c;
cin >> a, b, c;
cin 的分隔符⼀般⽤回车(Enter)。
备注:⼀般 C++ 中的 cin 和 cout 是适⽤于我们当前使⽤的控制台类型的⼯程,这样才能看到输⼊与输出的结果。以后⼤家接触到带界⾯的程序了,cin 和 cout 也就⽤不上了。
兼容C语⾔的输⼊与输出:
C++ 本⾝兼容 C语⾔,所以C语⾔中的输⼊与输出函数在C++仍然可以使⽤。例如:
getchar:字符输⼊函数
putchar:字符输出函数
scanf:输⼊
printf:输出
其中,scanf 和 printf 跟 C++ 中的 cin 和 cout 功能很类似,但是没有 cin 和 cout 智能。例如我⽤ printf 输出多个值,要这么写:
printf怎么输出字符int x = 2;
int y = 3;
printf("%d + %d = %d", x, y, x+y);
printf 中的输出参数中要明确指定每个变量要输出的类型,%d 代表整形,%s 代表字符串,%c 代表字符型。⽽ cout 就不⽤,全部智能识别了。
可以这么说,本⾝⼤家以后编写控制台类型的程序就不多,另外,对于输⼊和输出这块也不⽤掌握的⾮常深⼊,所以C语⾔的 getchar、putchar、scanf、printf 之类的⼤家有时间就学学,没时间就先放弃也⾏。把 cin 和 cout 的⼀些基本的使⽤弄明⽩了就可以了。以后真要是有⽤到的地⽅再去现查就来得及。不⽤⼀开始就细致⼊微,本⾝刚开始接触编程有很多东西就不是很懂所以不要求深扣某个细节,可以先⼤体上把知识点过⼀遍,之后从头再过⼀遍,每⼀遍都⽐前⼀遍要细致⼀些要深⼊⼀些,每⼀遍都可以学到不同的东西。
附录:标准输⼊输出流控制符
⼆、C++标准输⼊输出流的控制符
dec 设置整数的基数为10
hex 设置整数的基数为16
oct 设置整数的基数为8
setbase(n) 设置整数的基数为n(n只能是16,10,8之⼀)
setfill© 设置填充字符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 终⽌已设置的输出格式状态,在括号中应指定内容。
2.⽤流对象的成员控制输出格式
流成员函数 与之作⽤相同的控制符 作⽤
precision(n) setprecision(n) 设置实数的精度为n位。
width(n) setw(n) 设置字段宽度为n位。
fill© setfill© 设置填充字符c。
setf( ) setiosflags( ) 设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中内容相同。
ubsetf( ) resetiosflags( ) 终⽌已设置的输出格式状态。
cout.width(10);
cout.setf(ios::hex);
3.设置格式状态的格式标志
格式标志 作⽤
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
例⼦:
#include<iostream>
using namespace std;
int main()
{
int a=21;
cout.setf(ios::showbase);//设置输出时的基数符号
cout<<"dec:"<<a<<endl;//默认以⼗进制形式输出a
cout.unsetf(ios::dec);//终⽌⼗进制的格式设置
cout.setf(ios::hex);//设置以⼗六进制输出的状态
cout<<"hex:"<<a<<endl;//以⼗六进制形式输出a
cout.unsetf(ios::hex);//终⽌⼗六进制的格式设置
cout.setf(ios::oct);//设置以⼋进制输出的状态
cout<<"oct:"<<a<<endl;//以⼋进制形式输出a
cout.unsetf(ios::oct);//终⽌以⼋进制的输出格式设置
char*pt="China";//pt指向字符串”china”
cout.width(10);//指定域宽为10
cout<<pt<<endl;//输出字符串
cout.width(10);//指定域宽为10
cout.fill('*');//指定空⽩处以'*'填充
cout<<pt<<endl;//输出字符串
double pi=22.0/7.0;//计算pi值
cout.setf(ios::scientific);//指定⽤科学记数法输出
cout<<"pi=";//输出"pi="
cout.width(14);//指定域宽为14
cout<<pi<<endl;//输出"pi值
cout.unsetf(ios::scientific);//终⽌科学记数法状态
cout.setf(ios::fixed);//指定⽤定点形式输出
cout.width(12);//指定域宽为12
cout.setf(ios::showpos);//在输出正数时显⽰“+”号
cout.setf(ios::internal);//数符出现在左侧
cout.precision(6);//保留6位⼩数
cout<<pi<<endl;//输出pi,注意数符“+”的位置
return0;
}
输出:
dec:21(⼗进制形式)
hex:Oxl5 (⼗六进制形式,以0x开头)
oct:025(⼋进制形式,以O开头)
China (域宽为10)
*****china (域宽为10,空⽩处以'*'填充)
pi=**3.142857e+00(指数形式输出,域宽14,默认6位⼩数)
****3.142857(⼩数形式输㈩,精度为6,最左侧输出数符“+”)
1、成员函数width(n)和控制符setw(n)只对其后的第⼀个输出项有效。如果要求在输出数据时都按指定的同⼀域宽n输出,不能只调⽤⼀次width(n),⽽必须在输出每⼀项前都调⽤⼀次width(n)。
2、在表5中的输出格式状态分为5组,每⼀组中同时只能选⽤⼀种(例如,dec,hex和oct中只能选⼀,它们是互相排斥的),在⽤成员函数serf和控制符setiosflags设置输出格式状态后,如果想改设置为同组的另⼀状态,应当调⽤成员函数unsetf(对应于成员函数serf)或resetiosflags(对应于控制符sefiosflags),先终⽌原来设置的状态。然后再设置其他状态。
同理,程序倒数第8⾏的unsetf函数的调⽤也是不可缺少的。读者不妨上机试⼀试。
3、⽤serf函数设置格式状态时,可以包含两个或多个格式标志,由于这些格式标志在lOS类中被定义为枚举值,每⼀个格式标志以⼀个⼆进位代表,因此可以⽤“位或”运算符“I”组合多个格式标志
4、可以看到:对输出格式的控制,既可以⽤控制符(如例2),也可以⽤cout流的有关成员函数(如例3),⼆者的作⽤是相同的。控制符是在头⽂件mmamp中定义的,因此⽤控制符时,必须包含iomanip头⽂件。cout流的成员函数是在头⽂件iostream中定义的,因此只需包含头⽂件iostream,不必包含iomanip。许多程序⼈员感到使⽤控制符⽅便简单,可以在⼀个cout输出语句中连续使⽤多种控制符。
5、关于输⼭格式的控制,在使⽤中还会遇到⼀些细节问题,不可能在这⾥全部涉及。在遇到问题时,请查阅专门⼿册或上机试验⼀下即可解决。
三、详细⽤法
1、cin 简介
cin是C++编程语⾔中的标准输⼊流对象,即istream类的对象。cin主要⽤于从标准输⼊读取数据,这⾥的标准输⼊,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这⾥的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
在理解cin功能时,不得不提标准输⼊缓冲区。当我们从键盘输⼊字符串的时候需要敲⼀下回车键才能够将这个字符串送⼊到缓冲区中,那么敲⼊的这个回车键(\r)会被转换为⼀个换⾏符\n,这个换⾏符\n也会被存储在cin的缓冲区中并且被当成⼀个字符来计算!⽐如我们在键盘上敲下了123456这个字符串,然后敲⼀下回车键(\r)将这个字符串送⼊了缓冲区中,那么此时缓冲区中的字节个数是7 ,⽽不是6。
cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,⼀旦缓冲区中有数据,就触发cin的成员函数去读取数据。
2、cin 的常⽤读取⽅法
使⽤cin从标准输⼊读取数据时,通常⽤到的⽅法有cin>>,,line。
2.1、cin>>的⽤法
cin可以连续从键盘读取想要的数据,以空格、tab或换⾏作为分隔符。实例程序如下:
#include<iostream>
using namespace std;
int main()
{
char a;
int b;
float c;
string
cin>>a>>b>>c;
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
system("pause");
return0;
}
在屏幕中⼀次输⼊:a[回车]11[回车]5.56[回车],程序将输出如下结果:
C++中 cin 的详细⽤法
(1)cin>>等价于cin.operator>>(),即调⽤成员函数operator>>()进⾏读取数据。
(2)当cin>>从缓冲区中读取数据时,若缓冲区中第⼀个字符是空格、tab或换⾏这些分隔符时,cin>>会将其忽略并清除,继续读取下⼀个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后⾯的分隔符是残留在缓冲区的,cin>>不做处理。
(3)不想略过空⽩字符,那就使⽤ noskipws 流控制。⽐如cin>>noskipws>>input;
验证程序见如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
char a;
int b;
float c;
string str;
cin>>a>>b>>c>>str;
cout<<a<<" "<<b<<" "<<c<<" "<<str<<endl;
string test;
getline(cin,test);//不阻塞
cout<<"test:"<<test<<endl;
system("pause");
return0;
}
从键盘输⼊:[回车][回车][回车]a[回车]5[回车]2.33[回车]hello[回车],输出结果是:
从结果可以看出,cin>>对缓冲区中的第⼀个换⾏符视⽽不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但
是,getline()读取数据时,并⾮像cin>>那样忽略第⼀个换⾏符,getline()发现cin的缓冲区中有⼀个残
留的换⾏符,不阻塞请求键盘输⼊,直接读取,送⼊⽬标字符串后,再将换⾏符替换为空字符’\0’,因此程序中的test为空串。
2.的⽤法
该函数有有多种重载形式,分为四种格式:⽆参,⼀参数,⼆参数,三个参数。常⽤的的函数原型如下:
();
istream& (char& var);
istream& get (char* s, streamsize n );
istream& get (char* s, streamsize n,char delim )
其中streamsize 在VC++中被定义为long long型。另外,还有两个重载形式不怎么使⽤,就不详述了,函数原型如下:
istream& get ( streambuf& sb);
istream& get ( streambuf& sb,char delim );
2.2.读取⼀个字符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论