《C++PrimerPlus》笔记 -文件尾条件&cin的重定向

重定向

重定向,简单来讲就是改变输入或者输出的源头或者目标。
(即用文件替换键盘输入。)
(例如,要输入文件,可以使用ifstream类的对象来打开文件进行输入,也可以把cin重定向到文件。)

《C++PrimerPlus》中,描述到:
如果windows中有一个叫gofish.exe的可执行程序和一个名为fishtale的文本文件,那么可以在命令提示符中输入:
gofish <fishtale
这样,也就表示要从fishtale文件,而不是键盘,获得输入。
<是windows和unix命令提示符模式的重定向运算符。

表征流状态的量

  1. badbit:表示发生了系统级的错误,比如不可恢复的读写错误。一般来说badbit被置位之后,当前流就无法使用了。
  2. failbit:表示发生了可以恢复的错误,比如希望读取一个数值但是读取了字符。这种问题一般可以更正,流还可以继续使用。
  3. eofbit:到达文件的结束位置,eofbit和failbit都会被置位为1.
  4. goodbit:被置位说明流没有发生错误。上面三个只要有一个被置位,检查流状态的条件都会失败。
  5. bad(), fail(), eof(), good()都能检查对应的是否被置位了。返回1表示被置位。
  6. fail()可以用在更多的实现中。

检测是否读取到文件尾(EOF)

使用cin.eof()来检测是否读取到EOF。
当检测到EOF时,eofbit与failbit都被置为1.

读取到文件尾之后发生的事情

当cin方法检测到EOF的时候,此时cin将不再读取输入,即使再次调用cin也不行。

  • 一些程序允许使用Ctrl+Z来模拟EOF;
  • 一些系统认为Ctrl+Z将结束输入和输出;
  • 一些程序使用cin.clear()可以恢复输入和输出,清除EOF标记;
  • 而cin.clear()在认为Ctrl+Z结束了输入和输出的系统中无法恢复输入和输出。

模拟EOF输入

一般地,在不同的操作系统中,会允许通过键盘来模拟文件尾条件。

《C++PrimerPlus》中,描述到:
UNIX,可以在行首按CTRL+D实现
WINDOWS,可以按下CTRL+Z & ENTER
用于Mac的Symantec C++ 模拟了UNIX
Metrowerks Codewarrior 在Macintosh和windows环境中识别CTRL+Z
VC++,Borland C++, GNU C++都能识别行首的CTRL+Z,但是用户必须立刻按下回车键。

在程序中检测模拟文件尾输入,可以直接这样做:

char ch;
cin.get(ch);
while(cin)
{
	...
	cin.get(ch);
}

当然,这里while(cin)是更加普遍的做法,如果单纯检测模拟文件尾输入,应该这样:

while!cin.fail(){...}

while(cin) 比 while(!cin.fail()) 或者 while(!cin.eof()) 更加实用,因为第一个可以检测其他失败原因,比如磁盘的故障。

最后,由于cin.get(char)的返回值是cin,所以可以继续精简一下循环 :

while(cin.get(ch)){...}

不支持来自键盘的模拟EOF

这种情况,想用cin.get()锁住屏幕知道可以阅读,不起作用。
这个后面还要改。先留个地方。

总结一下cin.get(ch)与cin.get()

直接拍照了。书上总结的挺好。
在这里插入图片描述
即:cin.get(ch)通过返回转换为false的bool值来表征已到达EOF;cin.get()通过返回EOF来表征已到达EOF。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值