1,循环文本输入之cin
【注,cin省略空格和换行符,因此这些字符将不会回显,也不会被纳入到count统计计数】
发送给cin的输入前期会被缓存,直到操作者输入回车键,被缓存的输入数据才会被发送给程序处理;
2,cin.get(char)
逐个字符读取输入的程序需要检查每个字符,包括空格,制表符和换行符,cin系统函数所属的istream类(在iostream中定义)中包含一个能够满足这种要求的成员函数,具体地说,成员函数cin.get(ch)读取输入的下一个字符(即使他是空格),并将其付给ch;
C中类似于cin.get(ch)函数是会修改参数的值的,但是我们又说回来了,修改变量的值传入的需要是变量的内存地址&var,这种类似的规律是在C中的,那么在C++呢,调用cin.get()传递的是ch,而不是&ch,这里面有个 关于引用的问题,
3,文件尾条件
在实际的开发过程中,使用诸如#符号来表示输入介绍很令人满意,因为有可能这些符号是字符串输入中的某一个合法的字符输入,如果输入来自于文本的读取,可以使用文件尾检测(eof)
C++输入工具盒操作系统协同工作,来检测文件尾这种信息告知程序;
读取文件中的信息,cin等系统函数键盘输入;
重定向,允许用文件替换键盘输入;
很多操作系统都允许通过键盘来模拟文件尾条件,在UNIX中,可以在行首按下ctrl+D
windows中在命令行下可以在任意位置按Ctrl+Z和enter;
很多PC环境将Ctrl+Z视为EOF,
检测到EOF后,cin将2位(eofbit和failbit)都设置为1,通过成员函数eof()来查看eofbit是否被设置,如果检测到EOF,则cin.eof()将返回bool值true,否则返回false,同样cin.fail();
cin.get()锁屏,直到可以读取为止;
cin.clear()重置输入流;
系统支持的EOF
linux/unix及类系统 自编类cat程序
在字符读取循环中根据设定的循环条件;
总结,EOF结束输入(键盘模拟EOF或文本读取)
cin方法检查到EOF时,将设置cin对象中一个EOF条件的标记,设置这个标记后,cin将不读取输入,再次调用cin也不读取,对于文本读取有道理,因为程序不应该读取超出文件尾的内容
对于键盘输入,有可能使用模拟EOF来结束输入,但稍后要读取其他输入,cin.clear()方法清除EOF标记,使输入继续.
常见的字符输入
每次读取一个字符,直到遇到EOF的输入循环;
cin.get(ch);
while (cin.fail() == false) // test for EOF
{
...; // do stuff
cin.get(ch) //attempt to read another char
}
!运算符可以将true切换为false或将false切换为true,
whilel (!cin.get()) //while input has not failed;
方法cin.get(char)的返回值是一个cin对象,然而,istream类提供了一个可以将istream 对象(cin);
转换为bool值的函数,当cin需要bool值的地方(while循环的测试条件中);
while(cin) //while input is successful
while(cin)比!cin.fail()或!cin.eof()更通用,因为while(cin)可以检测到其他失败的原因,磁盘故障等;
while(cin.get(ch)) //while input is successfully
(确定结束条件,对条件进行初始化,更新条件)
int ch;
cin.get()代替cin.get(char);
cout.put()代替cout;
EOF代替cin.fail();
char ch;
cin.get(ch);
while (cin.fail() == false) //test for EOF
{
cout<<ch;
++count;
cin.get(ch);
}
int ch; //for compatibility with EOF value
ch = cin.get();
while (ch != EOF)
{
cout.put(ch); //cout.put(char(ch)) for some implementations
++count;
ch = cin.get();
}
cin.clear()重置输入流
cin.get()锁屏;
for (int row = 0;row < 4;row++)
{
for (int col = 0;col < 5; ++col)
cout<<maxtemps[row][col] <<"\t";
cout<<endl;
//循环的过程,循环row = 0,循环col 5 次;
每循环完一个row 和5次col后再进入到row 1 同样循环5次col;
}