您的位置:首页 > 编程语言 > C语言/C++

C++语法基础--istream,流状态及其影响,get(),getline(),ignore()

2013-08-10 09:36 501 查看
1.cin对象将标准输入表示为字节流。

2.istream类重载了抽取运算符>>,使其能够识别基本类型数据。

*hex,oct,dec控制符可以和cin一起使用,来指定将整数输入解释为十六进制,八进制,十进制

Example:

int main()

{

int x;

cin>>hex>>x; //f

cout<<x<<endl; //15



return 0;

}

*istream类重载了下列字符指针的>>抽取运算符

signed char*;

char*

unsigned char*

对于上述类型参数,抽取运算符将读取输入中的下一个单词,把它放到指定的地址,并加上空值字符,使之成为字符串

Example:

int main()

{

char ch[20];

cin>>ch; //hello nihao

cout<<ch; //hello



return 0;

}

*cin跳过空白直到遇到非空白字符。

其它模式下>>将读取一个指定类型的数据(从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容)

Example:

int main()

{



int x;

cin>>x; //输入_11abc,‘_'表示空白字符

cout<<x; //11



return 0;

}

3.流状态及其函数

cin或cout对象包含一个描述流状态的数据成员。






*设置流状态

void clear (iostate state = goodbit):将3个状态位(eofbit,badbit,failbit)清除,然后将状态设置为它的参数

Set error state flags

Sets a new value for the stream's internal error state flags.

void setstate (iostate state):只影响其参数已设置的位

Set error state flag

Modifies the current internal error state flags by combining the current flags with those in argument state ,

as if performing a bitwise OR operation.

iostate rdstate() const; 返回流状态

Get error state flags

Returns the current internal error state flags of the stream.

Example:

#include<iostream>

#include<sstream>

using namespace std;

void show_state (const ios& stream) {

cout << " good()=" << stream.good()<<ends;

cout << " eof()=" << stream.eof()<<ends;

cout << " fail()=" << stream.fail()<<ends;

cout << " bad()=" << stream.bad()<<ends;

cout<<endl;

}

int main () {

stringstream stream;

cout<<"clear(): "<<endl;

stream.clear (stream.goodbit);

show_state(stream);

stream.clear (stream.eofbit);

show_state(stream);

stream.clear (stream.failbit);

show_state(stream);

stream.clear (stream.badbit);

show_state(stream);



cout<<"setstate() : "<<endl;



stream.clear();

stream.setstate(stream.goodbit);

show_state(stream);



stream.setstate(stream.eofbit);

show_state(stream);



stream.setstate(stream.failbit);

show_state(stream);



stream.setstate(stream.badbit);

show_state(stream);



cout<<"rdstate()"<<endl;

cout<<stream.rdstate()<<endl;

return 0;

}

运行结果:



4.流状态的影响

*只有在流状态良好的情况下,下面的测试才返回true

*流状态会对后面的输入或输出关闭,直到位被清除

Example:



int main ()

{

int sum=0,val=0;

while(cin>>val)

{

sum+=val;

}

if(cin.eof()) // 文件结尾

cout<<"roop over"<<endl;



cout<<"sum : "<<sum<<endl;



int val1, val2;

cin>>val1; //将会被跳过

cin.clear(); //重置流状态

cin>>val2;

cout<<"val1: "<<val1<<ends<<"val2: "<<val2<<endl;

return 0;

}

运行结果:




*当不正确输入时,将返回failbit,不正确输入的数据仍留在输入队列中,如果仅仅只是设置流为godbit,下次读取同类型时将会进入failbit状态,



Example:

int main ()

{

int sum=0,val=0,val2;

while(cin>>val) //输入1 2 3 a

{

sum+=val;

}



cout<<"sum : "<<sum<<endl;

cin.clear(); //重置流状态

cin>>val2; //读取到的仍然是输入队列中的a ,无需从键盘输入

char c;

cin.clear(); //重置流状态

cin>>c; //提取a,无需从键盘输入

cout<<c; //a



return 0;

}



运行结果:



解决办法,跳过此不正确输入的数据。

Example:

int main ()

{

int sum=0,val=0,val2;

while(cin>>val) //输入1 2 3 a

{

sum+=val;

}



cin.clear(); //重置流状态

cout<<"sum : "<<sum<<endl;

while(cin.get()!='\n') //跳过a

continue;

cin>>val2; //需从键盘输入

cout<<"val2: "<<val2<<endl;



return 0;

}

运行结果:






bool fail() const;

Check whether either failbit or badbit is set

Returns true if either (or both) the failbit or the badbit error state flags is set for the stream.

5.istream中的get()

Get characters,Extracts characters from the stream, as unformatted input:

single character :

int get(); //读取一个输入字符,即使是空格,制表符或换行符

istream& get (char& c); //将输入字符赋给其参数

*cin>> 抽取运算符跳过了换行符,因此,下面的代码将进入死循环

Example:

int main ()

{

char c;

cin.get(c);

while(c!='\n')

{

cin>>c;

}



return 0;

}

get()和get(ch)的对比






c-string :

istream& get (char* s, streamsize n);

istream& get (char* s, streamsize n, char delim);



stream buffer :

istream& get (streambuf& sb);

istream& getline (char* s, streamsize n );

istream& getline (char* s, streamsize n, char delim );

*上面函数中,第一个参数是用于放置输入字符串的内存单元的地址,第二个参数比要读取的最大字符数大1(额外的一个字符用于存储结尾的空白字符)

第三个参数用作分界的字符,遇到分界符后,输入将停止,即使还未读取到最大数目的字符

*get和getline()的区别在于,get()将换行符或分界符留在输入流中;getline()抽取并丢弃输入流中的换行符或分界符

istream& ignore (streamsize n = 1, int delim = EOF):

Extract and discard characters

Extracts characters from the input sequence and discards them, until either n characters have been extracted,

or one compares equal to delim.

Example:

int main ()

{

const int max=256;

char c;char str[max];

cin.get(str,max,'#'); //读取256个字符或遇到‘#’结束,'#'留在输入流

cin.get(c); //读取'#'

cout<<"str is: "<<str<<endl;

cout<<"c is "<<c<<endl<<endl;

cin.ignore(max,'\n'); //跳过256个字符,或遇到'\n'结束

cin.getline(str,max,'#'); //读取256个字符或遇到‘#’结束,'#'被抛弃

cin.get(c); //读取'#'后面的下一个字符

cout<<"str is: "<<str<<endl;

cout<<"c is "<<c<<endl;

return 0;

}



运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐