把c++的输入输出整理
一直对这个输入输出有了解,但是不是特别的清楚,毕竟混乱是一切忧虑的根源!
比较晚了,没有怎么仔细检查,如果有错误请大家见谅。。。
1.>>跳过了空格制表符和换行,也就是说 12 13 14 15 cin>>a;
会直接读取12,然后跳过空格,直接来到13
2.cin.get(char&)
不跳过空格等,并且返回调用它的isteream的引用(注意,当到达文件尾的时候,返回false,因此可用来判断是否到达文件尾)
和cin.get(char&)类似,同样不跳过空格等,但是以返回值的形式将输入传递给程序(注意它的返回类型为整型,但是到达文件尾时返回EOF)
什么是EOF?
(1)
计算机术语,缩写通常为EOF(End Of File),在操作系统中表示资料源无更多的资料可读取。
(2)
在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志
(3)
C语言中,当把数据以二进制形式存放到文件中时,就会有-1值的出现,此时不能采用EOF作为二进制文件的结束标志
因此,我们经常犯的一个致命错误就是:使用char型来接收cin.get()的返回值。
因为当读取到文件尾时,返回EOF(也就是-1),就会导致错误。
详细介绍可参考这篇文章第四点:http://blog.csdn.net/deh_1984/article/details/2611310
istream& get(char*,int)
istream& getline(char*,int ,char)
istream& getline(char*,int)
都是读取一行,直到最大数目(比如,cin.get(c,10),则最大数为9,当读到第9个后,停止读取)或者遇到换行符(默认为'\n')
他们的主要区别在于:
get()将换行符(默认)留在输入流中,接下来读取到的将是换行符
getline()会抽取换行符(默认),并且将输入流中的换行符丢弃(因此,我们常常这么用 cin.get(pl,size).get();后面那个get用来读取换行符
但是我们需要特别注意下意外字符的输入:
get(str,Size):读取Size-1个字符,并将str[Size-1]置为'\0',然后将剩余字符(包括'\n')留在输入缓冲区中,这些字符将被下一个读取输入的操作捕获,影响该输入处理;
getline(str,Size):读取Size-1个字符,并将str[Size-1]置为'\0',剩余字符(包括'\n')留在输入缓冲区中,随即设置cin失效位(即if(!cin)的判断为真),关闭输入。其后的所有输入都无法得到任何东西,当然也无法得到输入缓冲区中剩余的字符串。但如果用clear()重置cin,其后的输入便可用并会得到遗留在输入缓冲区中的字符。
get(str,Size):str将得到'\0'(注意区别于空格),并设置cin实效位,关闭输入,但回车依然留在输入缓冲区中,因此如果我们用clear()重置cin,其下一个读取输入的操作将捕获'\n';
cin.get(char*,int)的常用代码:
未完待续中.....