C++ Cin判断输入结束

cin可以用来从键盘输入数据;将标准输入定向为文件后,cin也可以用来从文件中读入数据。在输入数据的多少不确定,且没有结束标志的情况下。若是从文件中读取数据,到达文件末尾就读取结束了。从控制台读取数据时,可以通过输入特殊的控制字符:

在window系统中,通过键盘输入时,按Ctrl+Z组合键后再按回车键,就代表输入结束。

在UNIX/Linux/Mac OS系统中,Ctrl+D代表输入结束。

cin判断控制台(键盘)读取结束

#include <iostream>
using namespace std;
int main()
{
    int n;
    int maxN = 0;
    while (cin >> n){  //输入没有结束,cin 就返回 true,条件就为真
        if (maxN < n)
            maxN = n;
    }
    cout << maxN <<endl;
    return 0;
}

当我们输入一串数据,按下Ctrl+Z组合键时,表示输入结束。

Cin判断文件读取结束

如果将标准输入重定向为某个文件,如在程序开始添加freopen("test.txt","r",stdin);语句,或者不添加上述语句,但是在Windows的”命令提示符“窗口中输入:

mycin<test.txt//假设编译生成的可执行文件的名字为mycin.exe

则都能使得本程序不再从键盘输入数据,而是从test.txt文件输入数据(前提是test.txt文件和mycin.exe在同一个文件夹中)。在这种情况下,test.txt文件中并不需要包含Ctrl+Z,只要有用空格或者回车隔开的若干个整数即可。

cin读到文件末尾是,cin>>n就会返回false,从而导致程序结束。

cin.get():C++读取单个字符

get()是istream类的成员函数,它有多种重载形式,其中最常用的一种:

int get();

此函数从输入流中读入一个字符,返回值就是该字符夫人ASCLL码。如果碰到输入的末尾,则返回EOF(End of File的缩写)。istream类中从输入流(包括文件)中读取数据成员函数,在把输入数据都读取完后再进行读取,就会返回EOF。EOF是在iostream类中定义的一个整形常量,值为-1。

get()函数不会跳过空格、制表符、回车等特殊字符,所有的字符都能被读入。

#include <iostream>
using namespace std;
int main()
{
    int c;
    while ((c = cin.get()) != EOF)
        cout.put(c);
    return 0;
}

程序中的变量c应为Int类型,而不能是char类型。在输入流中碰到ASCII码等于0xFF的字符串时,cin.get()返回0xFF,0xFF赋值给c,此时如果c是char类型的,那么其值就是-1(因为符号位1代表负数),即等于EOF,于是程序就错误地认为输入已经结束。

要将文本test.txt中的全部内容原样显示出来,程序可以如下编写:

#include <iostream>
using namespace std;
int main()
{
    int c;
    freopen("test.txt", "r", stdin);  //将标准输入重定向为 test.txt
    while ((c = cin.get()) != EOF)
        cout.put(c);
    return 0;
}

本文内容来自http://c.biancheng.net/view/278.html

### 如何在C++中通过`cin`输入判断循环的结束条件 在C++编程中,使用`cin`进行输入操作时,可以通过特定的方式设置循环的结束条件。通常情况下,`cin`会持续读取用户输入直到满足某种终止条件为止。这种终止条件可以由文件结束符(EOF)、无效输入或其他逻辑控制来触发。 #### 文件结束符(EOF) 当程序运行于命令行环境时,用户可以通过按下组合键 `Ctrl+Z`(Windows系统) 或 `Ctrl+D`(Unix/Linux/MacOS系统) 来发送一个文件结束信号[^2]。一旦接收到该信号,`cin` 的状态会被标记为失败 (`fail`),从而退出基于它的任何输入循环。 以下是利用 EOF 实现循环终止的一个简单例子: ```cpp #include <iostream> using namespace std; int main() { int sum = 0, value; while (cin >> value) { // 当 cin 成功读取到有效整数值时执行循环体 sum += value; // 累加每次成功读取的数据项至总和变量 'sum' } cout << "Sum of entered numbers: " << sum << endl; // 输出最终计算得到的结果 return 0; } ``` 在这个实例里,只要标准输入流能够正常解析成整数类型并赋值给变量 `value` ,那么 `while` 循环就会一直保持活跃状态,并不断累加这些被正确解读出来的数值[^1]。然而,假如遇到了无法转换成预期类型的字符序列或者达到了前述提到的操作系统的特殊中断指令,则会让整个过程停下来。 #### 非法输入处理 除了依靠外部手段如按键组合之外,还可以设计内部机制应对异常情况下的退出需求。比如规定某些特殊的标志位作为分隔符或停止符,在检测到它们之后便立即跳出当前正在进行中的迭代流程[^3]。 考虑下面这个稍微复杂一点的情形——允许连续录入多组数据集直至遇见指定关键词才停下脚步: ```cpp #include <iostream> #include <string> using namespace std; int main(){ string line; double number; vector<double> dataset; cout<<"Enter your data followed by END to finish:"<<endl; do{ getline(cin,line); // 使用getline函数一次性获取一整行的内容 stringstream ss(line); while(ss>>number){ dataset.push_back(number); // 如果能顺利提取出浮点数则加入集合之中 } if(!line.empty() && line.back()=='\r') line.pop_back(); // 去除可能存在的多余回车符 }while(!(line=="END" || line=="end")); // 只有当输入完全匹配预设关键字才会真正脱离外层do...while结构 cout<<"\nYou've entered "<<dataset.size()<<" valid entries."<<endl; return 0; } ``` 此版本采用了双重嵌套形式:最外面一层负责逐次接纳新批次记录;里面那一部分则是针对单条目逐一剖析验证合法性后再决定是否收纳其中。值得注意的是这里还引入了一个额外的小技巧用于消除潜在干扰因素的影响[^4]。 ### 总结 综上所述,对于希望借助`cin`达成灵活可控的数据采集目的开发者而言,既可以选择依赖平台专属快捷方式发出终止讯号,也可以自行定义独特模式以便更精确地掌控局面发展走向。无论采取哪种策略都需要充分考虑到实际应用场景下可能出现的各种边界状况以及相应规避措施的有效部署。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Estelle_Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值