c++输入输出总结

在学习C++的过程中,经常会遇到输入输出的问题,以下总结一下下面几个函数的用法: 
1)
cin 
2)
cin.get() 
3)
cin.getline() 
4)
getline() 
5)
gets()

6)getchar()

一、cin


cin是遇到回车停止输入,按照空格输出的。空格、回车等会被丢弃(这些还在缓冲区中,下次若用cin会自动丢弃),下次又会读取流中剩下的内容。(对于要输入一个字符串如果用cin>>input;这样的方法来输入一个字符串,则遇到空白换行,制表之类的,输入都会停止因为从流中读入数据保存到string中,string会遇到空格就停止录入。这样当我们输入一行带空格的字符串,就要考虑getline函数,从流中读入一行字符串。

str3没出现让输入数据,这是因为流中还有数据,会直接读取。

二、getline()详解

get与getline区别不是很大,但一个明显的区别是get遇到'\n '字符后便返回,这时 '\n '还在缓冲区中,所以下次读出来的将是 '\n ',而getline遇到'\n '也返回,但它会把 '\n '从缓冲区里移除掉,所以很多时候用getline方便些。

cin.getline()函数是处理数组字符串的,其原型为cin.getline(char* , int),第一个参数为一个char指针,第二个参数为数组字符串长度。似乎也可以加入一个结束标志符。加入结束标识符是读到结束标志符停止的,没有的话是读入一行。

getline(cin,str)函数是处理string类的函数。第二个参数为string类型的变量。

getline(cin,str,'结束标识符')读到结束标志符停止读入。

一些编程题要求先输入字符串行数,然后再一行一行读入字符串。如果正常顺写编程的话,会发现第一行字符串读入的是空,后续才能正常录入每行字符串。 这是因为第一行输入一个string数据后,换行符并没有被忽略,直接被准备读入第一行字符串的getline俘获。 所以需要调用cin.ignore()忽略下面的一个流录入,将其抛弃。



红色是输出,可以观察输入有#,回车后就会输出,一行一行的输出。下次#后的会照样输出。但#丢弃。

三、getchar

getchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。
当你输入一行完成后,程序才会进入while中,一一根据流判断每个字符。当判断起头不是空格,cin会将直到下个空格前的整个数据赋给int类型。这块巧妙应用了ungetc()函数返回字符到流中的功能。

四、get

get进行单字符输入,在有参数或者没有参数的情况下,get函数读取一个输入字符,不管这个字符是啥换行,制表都可以,直接读进去。(有参数的情况下,可根据你输入的参数确定读出的字符数),其中getvoid)将字符转换成整形后返回。如果读取倒了文件尾,或者键盘输入的尾部等没东西可读的情况的时候,cin.get(ch);会返回false,其余正常情况返回的都是true

get()函数在遇到换行符读取完字符时并不会读取换行符或者是本来的默认分界符,而这些东西都只会留在原始流之内。

char input[10];

char ch;

cin.get(input,10,'a');//a是输入结束的标志,10是读取流的大小(超出的被丢弃)

cout <<input << endl;

cin.get(ch);//此时a还留在缓冲区中,故下面的会输出a

cout<<ch<<endl;

输入sdsdsda  

输出sdsdsd

a

而getline()函数会自动丢弃换行符等分界符。

char input[10];
char ch;
cin.getline(input,10,'a');读入字符,直到遇到a,\n也会读入
cout << input << endl;
cin.get(ch);//a被丢弃
cout<<ch<<endl;

输入 sdsdsda

输出sdsdsd

 

因为丢弃分界符,则分界符a被丢弃,下面的cin.get(ch)读到的是换行符,所以输出的时候就只是输出一个换行符。

五、fgets

fgets从文件流读取一行,送到缓冲区。(带s的函数)需要注意的是fgets保留换行符'\n',而gets是从stdin输入,在读取字符串时会删除结尾的换行符'\n';同样,fputs写入时不包括换行符,而puts在写入字符串时会在末尾添加一个换行符。

猜你喜欢

转载自blog.csdn.net/E_ROAD_BY_U/article/details/70232821