c++primer plus第十七章-cin输入、cout输出和文件I/O
1)流状态
eofbit:如果到达文件尾,则设置为1;
badbit:如果流被破坏,则设置为1;例如,文件读取错误;
failbit:如果输入操作未能读取预期的字符或输出操作没有写入预期的字符,则设置为1;
goodbit:另一种表示0的方法;
good():如果流可以使用(所有的位都被清除),则返回true;
eof():如果eofbit被设置,则返回true;
bad():如果badbit被设置,则返回true;
fail():如果badbit()或failbad()被设置,则返回true;
rdstate():返回流状态;
exceptions(isostate ex):设置哪些状态将导致clear()引发异常;例如,如果ex是eofbit,则如果eofbit被设置,clear()将引起异常;
clear(iostate s):将流状态设置为s;s的默认值为0(goodbit);如果(restate()&exceptions())!=0,则引发异常basic_ios::failure;
setstate(iostate s)调用clear(rdstate()|s)。这将设置与s中设置的位对应的流状态位,其他流状态位保持不变。
2)单字符输入
在使用char参数或没有参数的情况下,get()方法读取下一个输入字符,即使该字符是空格、制表符或换行符。get(char &ch)版本将输入字符赋给其参数,而get(void)版本将输入字符转换为整形(通常是int),并将其返回。
第一:成员函数get(char &)
char ch;
cin.get(ch);
如果cin.get(char &)到达文件尾,无论是真正的文件尾,还是通过键盘仿真的文件尾(对于DOS和Windows命令提示符模式,为按下ctrl+z;对于UNIX,是在行首按下ctrl+d),它都不会给其参数赋值。这是完全正确的,因为如果程序到达文件尾,就没有值可供赋给参数了。
char ch;
while(cin.get(ch))
{... ...}
第二:成员函数get(void)
get(void)成员函数还读取空白,但使用返回值来将输入传递给程序。
到达文件尾后(不管是真正的文件尾还是模拟的文件尾),cin.get(void)都将返回值EOF-头文件iostream提供的一个符号常量。这种设计特性使得可以这样来读取输入:
int ch;
while( ( ch=cin.get() ) !=EOF )
{... ...}
这里应将ch的类型声明为int,而不是char,因为值EOF可能无法使用char类型来表示;
3)cin.get(ch)和cin.get()的区别
特征 cin.get(ch) cin.get()
传输输入字符的方法 赋给参数ch 将函数返回值赋给ch
字符输入时函数的返回值 指向istream对象的引用 字符编码(int值)
达到文件尾时函数的返回值 转换为false EOF
4)istream &get(char *,int, char);
istream &get(char *,int);
istream &getline(char *,int, char);
istream &getline(char *,int);
第一个参数是用于放置输入字符串的内存单元的地址。第二个参数比要读取的最大字符数大1(额外的一个字符用于存储结尾的空字符,以便将输入存储为一个字符串)。第3个参数指定用作分界符的字符,只有两个参数的版本将换行符用作分界符。上述函数都在读取最大数目的字符或遇到换行符后为止。
get()和getline()的最大区别在于:get()将换行符留在输入流中,这样接下来的输入操作首先看到的是换行符;而getline()抽取并丢弃输入流中的换行符。
5)成员函数ignore()
原型:istream &ignore(int =1, int = EOF);
该函数接受两个参数,第一个是数字,指定要读取的最大字符数;第二个是字符,用作分界符。
默认参数值EOF导致ingore()读取指定数目的字符或读取到文件尾。
6)其他istream方法
第一:read()函数读取指定数目的字节,并将它们存储在指定的位置中。
char gross[144];
cin.read(gross,144);
read()不会在输入后加上空值字符,因此不能将输入转换为字符串。
第二:peek()函数返回输入中的下一个字符,但不能抽取输入流中的字符。也就是说,它使得能够查看下一个字符。假设要读取输入,直到遇到换行符或句点,则可以用peek()查看输入流中的下一个字符,以此来判断是否继续读取。
第三:gcount()方法返回最后一个非格式化抽取方法读取的字符数。这意味着字符是由get()、getline()、ignore()和read()方法读取的,不是由抽取运算符(>>)读取的,抽取运算符对输入进行格式化,使之与特定的数据类型匹配。
第四:putback()函数将一个字符插入到输入字符串中,被插入的字符将是下一条输入语句读取的第一个字符。putback()方法接受一个char参数--要插入的字符,其返回类型为istream&,这使得可以将该函数调用与其他istream方法拼接起来。使用peek()的效果相当于先使用get()读取一个字符,然后使用putback()将该字符放回到输入流中,然而,putback()允许将字符放到不是刚才读取的位置。
7)