C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用链接

留言簿(8)

搜索

  •  

最新评论

阅读排行榜

评论排行榜


1、使用原始的cin进行输入
      如果程序要使用循环来读取来自键盘的文本输入,则必须有办法知道何时停止读取。如何知道这一点呢?一种方法使选择某个特殊字符——有时被称为哨兵字符(sentinel character),将其作为停止标记。
      下面程序,遇到#字符时停止读取输入。该程序计算读取的字符数,并回显这些字符,即在屏幕上显示读取的字符。按下键盘上的键不能自动将字符显示到屏幕上,程序必须通过回显输入字符来完成这项工作。通常,这种任务由操作系统处理。在这个程序中,操作系统和测试程序都回显输入。运行完毕后,该程序报告处理的总字符数

#include "stdafx.h"
#include 
<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    
char ch;
    
int count=0;    //use basic input
    cout<<"Enter characters; enter # to quit:\n";
    cin
>>ch;    //get a character
    while(ch!='#')    //test the character
    {
        cout
<<ch;    //echo the character
        ++count;    //count hte character
        cin>>ch;    //get the next character
    }

    cout
<<endl<<count<<" characters read\n";
    
return 0;
    
//该程序忽略空白字符
}
      程序说明:请注意该程序的结构。该程序在循环之前读取第一个输入字符,这样循环可以测试第一个字符。因为第一个字符可能是#。
      为什么该程序省略了空格呢?原因在cin。读取char值时,与读取其他基本类型一样,cin将忽略空格和换行符。因此输入中的空格没有被回显,也没有被包括在计数内。
      更为复杂的是,发送给cin的输入被缓冲。这意味着只有在用户按下回车键后,他输入的内容才会被发送给程序。这就是在运行该程序时,可以在#后面输入字符的原因。按下回车键后,整个字符序列将被发送给程序,但程序在遇到#字符后将结束对输入的处理。

2、使用cin.get(char)进行补救
      通常,逐个字符读取输入的程序需要检查每个字符,包括空格、制表符和换行符。cin所属的istream类(在iostream中定义)包含一个能够满足这种要求的成员函数。具体地说,成员函数cin.get(ch)读取输入中的下一个字符(即使它是空格),并将其赋给变量ch。使用这个函数调用替换cin>>ch,可以修补第一个程序的问题。
      
#include "stdafx.h"
#include 
<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    
char ch;
    
int count=0;    
    cout
<<"Enter characters; enter # to quit:\n";
    cin.
get(ch);    
    
while(ch!='#')    //test the character
    {
        cout
<<ch;    
        
++count;    
        cin.
get(ch);    
    }

    cout
<<endl<<count<<" characters read\n";
    
return 0;
}
      该程序回显了每个字符,并将全部字符计算在内,其中包括空格。输入仍被缓冲,因此输入的字符个数仍可能比最终到达程序的要多。
      如果熟悉C语言,可能以为这个程序存在严重的错误。cin.get(ch)调用将一个值放在ch变量中,这意味着将修改该变量的值。在C语言中,要修改变量的值,必须将变量的地址传递给函数。但上面程序中,调用cin.get()时,传递的是ch,而不是&ch。在C语言中,这样的代码无效,但在C++中有效,只要函数将参数声明为引用即可。引用是C++中的一种新类型。头文件iostream将cin.get(ch)的参数声明为引用类型,因此该函数可以修改其参数的值。

3、文件尾条件
      如果输入来自文件,则可以使用一种功能更强大的技术——检测文件尾(EOF)。C++输入工具和操作系统协同工作,来检测文件尾并将这种信息告知程序。读取文件中的信息同cin和键盘输入存在两个相关的地方:首先,很多操作系统(包括UNIXMS-DOS)支持重定向,允许用文本替换键盘输入。加入,假设在MS-DOS中有一个名为gofish.exe的可执行程序和一个名为fishtale的文本文件,则开一个在DOS提示符下输入下面的命令:gofish <fishtale。这样,程序将从fishtale文件(而不是键盘)获取输入。<符号式UNIXDOS上的重定向操作符。其次,很多操作系统都允许通过键盘来模拟文件尾条件。如果编程环境能够检测EOF,可以在程序中使用重定向的文件,也可以使用键盘输入,并在键盘中输入中模拟EOF。那么,检测到EOF后,cin将两位(eofbitfailbit)都设置为1。可以通过成员函数eof()来查看eofbit是否被设置;如果检测到EOF,则cin.eof()将返回booltrue,否则返回false。同样,如果eofbitfailbit被设置为1,则fail()成员函数返回true,否则返回false。注意,eof()fail()方法报告最近读取的结果,也就是说,它们在事后报告,而不是预先报告。因此应将cin.eof()cin.fail()测试放在读取后。fail(),相对于eof(),可用于更多的实现中。
#include "stdafx.h"
#include 
<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    
char ch;
    
int count=0;    
    cout
<<"Enter characters; enter # to quit:\n";
    cin.
get(ch);    
    
while(cin.fail()==false)    //test for EOF
    {
        cout
<<ch;    
        
++count;    
        cin.
get(ch);    
    }

    cout
<<endl<<count<<" characters read\n";
    
return 0;
}

程序运行状况:


      通过使用重定向,可以用该程序来显示文本文件,并报告它所包含的字符数。
posted on 2010-02-06 20:48 烟皑 阅读(937) 评论(0)  编辑 收藏 引用 所属分类: C++ primer plus学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理