【概述】在c++标准模板库中提供了一组模板类来支持面向对象的数据的输入输出功能,如基本的输入输出流 istream类/ostream类/iostream类,文件输入输出流 ifstream类/ofstream类/fstream类,字符串输入输出流 stringstream类/istream类/ostream类等。他们在数据流的处理上具有灵活,完善,强大的功能。
//eg.标准输入输出流给不同变量赋值
#include<iostream>
using namespace std;
int main()
{
int i;
float f;
char str[20];
cin>>i;
cin>>f;
cin>>str;
cout<<"i= "<<i<<endl;
cout<<"f= "<<f<<endl;
cout<<"str= "<<str<<endl;
return 0;
}
//标准输入给不同类型变量赋值的不足案例
#include<iostream>
using namespace std;
int main()
{
int i;
char str[20];
cout<<"请输入一个整型数及一个字符串";
cin>>i>>str;
cout<<"i ="<<i<<endl;
cout<<"str ="<<str<<endl;
return 0;
}
/*
输入: 1 hello world
输出: i =1
str= hello
可以看出str等于hello,并未hello world,这是由于命令行各参数默认是以空格为界定符的,
1正常的赋给了i,由于hello后面是空格,因此解析串到此为止就停止了,所以str等于hello。
*/
/*
常用的get函数有三个
1>int get()
返回输入流一个字符的ASCLL值
2>istream& get(unsigned char * pszBuf,int nBufLen,char delim='\n')
● pszBuf:指向字符缓冲区的指针,用于保存结果
● nBufLen:缓存区长度
● delim:结束字符,根据结束字符判断何时停止读入操作。
3>istream& getline(unsigned char * pszBuf,int nBufLen,char delim='\n')
get和getline的区别:
当遇到输入流的界定符(delim即结束字符),get()停止执行,但是并不从输入流中
读取界定符,直接在字符串缓存区尾部加结束字符‘\0’,函数getline()相反,他将
从输入流中提取界定符,但不会把它存储到结果缓存区中。
*/
#include<iostream>
using namespace std;
int main()
{
char szBuf[60];//定义输入字符串接收缓冲区
cout<<"请输入一个字符串";
int n = cin.get();//先读一个人字符
cin.getline(szBuf,60);//接着读一行字符,遇到结束符‘\0’停止
cout<<n<<endl;
cout<<"The received string is: "<<szBuf<<endl;
return 0;
}
/*
输入:How are you?
72
The received string is: ow are you?
*/
【处理流错误】
/*
例如应该输入一个整型数据,可是却误输入了字符串,如何来判断此类错误信息呢?
C++对每次输入输出操作都记录了其状态信息,
获取状态信息的函数如下:
int rdstate();无参数,返回值即是状态信息特征值
使用下面函数来检测相应输入输出状态
● bool good();若返回true,一切正常没有错误发生
● bool eof();若返回true,标明已经到达流的末尾
● bool fail();若返回true,表明I/O操作失败,主要由于读入非法数据(例如要求int
却读了char)
● bool bad();若返回true,表明发生了(或许是物理上的)致命性错误,流将不能继续使用。
*/
//判断是否输入整形数
#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"请输入一个数据:";
cin>>a;
cout<<"状态值为 "<<cin.rdstate()<<endl;
if(cin.good()){
cout<<"输入的数据正确"<<endl;
}
if(cin.fail()){
cout<<"输入数据类型错误,非致命错误,可清楚缓存区挽回"<<endl;
}
return 0;
}
/*
输入: 1 b
输出: 状态值0 4
*/
/*
通常当发现输入有错当需要改正的时候,使用clear()更改标记改正确后,同时需要
使用get()成员函数清除输入缓冲区,以达到重复输入的目的
*/
//确保输入一个整型数给变量a
#include<iostream>
using namespace std;
int main()
{
int a;
//char buf[10];
while(1){
cin>>a;
if(cin.fail()){
cout<<"输入有错,请重新输入"<<endl;
cin.clear();
//cin.getline(buf,10);也可以使用getline一次清除
cin.get();
}
else{
cout<<a<<endl;
break;
}
}
return 0;
}
//输入abcd 打印四次输入有错,请重新输入,因为get是一个一个字符清除