while(cin)?

#include<iostream>
#include<utility>
using namespace std;
int main()
{
   int i;
   do
   {
    cout<<i<<endl; 
   }while(cin>>i);
}

首先输出个0.之后输入X,输出X;当输入ctrl+d时,没有输出,结束。

#include<iostream>
#include<utility>
using namespace std;
int main()
{
   int i;
   do{
      cin>>i;
      cout<<i<<endl; 

   }while(cin); 
}

输入x,输出x;当输入ctrl+d时,再输出个上一次的输入量,结束。

ctrl+d表示表示输入错误。

cin.clear()可以重新将cin置为有效。

 

导致循环终止的原因是流对象cin进入错误状态:系统输入级故障;读入了无效数据;遇到文件结束符。

下面是一个用到cin判断作为循环条件的程序:

#include<iostream>
#include<utility>
#include<vector>
#include<map>
using namespace std;
int main()
{
   map<string,vector< pair<string,string> > > family;
   pair<string,string> pa;
   string surName,childName,birthDate;
   do{
      cout<<"enter surname"<<endl;
      cin>>surName;
      if(!cin)
     break;                     //如果cin无效,跳出循环
      vector< pair<string,string> > child;
      pair<map<string,vector<pair<string,string> > >::iterator,bool>
      ret = family.insert(make_pair(surName,child));
      cout<<"input name and age"<<endl;
      while(cin>>surName>>birthDate)
      {
         pair<string,string> pa;
         pa = make_pair(surName,birthDate);
         ret.first->second.push_back(pa);     //ctrl+d跳出循环,此时cin无效
      }
      cin.clear();           //使cin重新有效,以达到下面while循环条件。
   }while(cin);
   cout<<"enter search"<<endl;
   cin.clear();
   cin>>surName;
   map<string,vector< pair<string,string> > >::iterator it = family.find(surName);
   if(it==family.end())
   cout<<"no this surname"<<endl;
   else
   {
   vector< pair<string,string> >::iterator itt = it->second.begin();
   while(itt!=it->second.end())
      {
      cout<<(*itt).first<<"\t\t"<<(*itt).second<<endl;
      itt++;
      }
   }
   return 0;
}

 

转载于:https://www.cnblogs.com/little-white/p/3594384.html

<think>我们正在讨论C++中while(cin>>var)循环的停止条件。用户希望了解如何控制这种循环的结束。根据引用内容,有几种常见方法:1.使用文件结束符(EOF):在命令行中输入时,可以通过特定的按键组合(如Windows下Ctrl+Z,Linux/Mac下Ctrl+D)来发送EOF信号,使cin接收到结束状态。2.通过判断输入字符串是否为空(如引用1中,使用getline并判断str!="",但注意这需要用户输入空行)。3.在输入过程中通过检测回车符('\n')来结束(如引用3所示),这种方法适合需要在一行输入结束后跳出循环的情况。用户的问题集中在while(cin>>var)循环,所以我们重点讨论这种形式。基本知识:while(cin>>var)循环会持续读取输入直到遇到以下情况之一:-输入流到达文件末尾(EOF)-输入与变量类型不匹配(例如,期望整数却输入了字母)-输入流发生错误但是,用户可能希望在一行输入结束后就跳出循环,而不是等待EOF或错误输入。引用3提供了一种方法:在每次读取后使用cin.get()检查下一个字符是否为回车,如果是则跳出循环。下面我们详细说明引用3的方法:示例代码(输入整数直到回车):```cpp#include<iostream>usingnamespacestd;intmain(){inta;while(cin>>a){//处理a//然后检查下一个字符是否是回车,如果是则跳出if(cin.get()=='\n')break;}return0;}```注意:这种方法有一个潜在问题:当输入最后一个整数后直接按回车,cin.get()会读取到回车,循环跳出。但如果输入最后一个整数后还有空格或其他字符再按回车,则cin.get()读取的是空格,而不是回车,因此不会跳出。所以这种方法要求输入的数据之间用空格分隔,最后一个数据后面不能有空格(或者需要额外的处理)。另一种方法是读取一行(使用getline),然后用字符串流(stringstream)来解析该行。这种方法更健壮:```cpp#include<iostream>#include<sstream>#include<string>usingnamespacestd;intmain(){stringline;while(getline(cin,line)){//读取一行if(line.empty())break;//如果为空行则跳出stringstreamss(line);intnum;while(ss>>num){//从该行中逐个读取整数//处理num}}return0;}```这种方法可以避免上述问题,因为整行读取后再解析,不会受行尾空格的影响。总结:1.使用EOF:适用于从文件读取或用户主动发送EOF信号。2.在循环内检测回车:适用于要求输入单行数据后立即处理的情况,但要注意输入格式。3.使用getline和字符串流:更健壮,推荐用于需要按行处理的情况。根据用户的问题,他可能更关心如何在交互式输入中结束循环(而不是用EOF)。因此,我们重点介绍了检测回车和按行读取的方法。生成相关问题:1.如何在C++中从控制台读取多行整数?2.使用while(cin>>var)时,如何忽略输入错误(比如类型不匹配)?3.在C++中,EOF和输入错误有什么区别?</think>### C++ `while(cin >> var)` 停止条件详解 在 C++ 中,`while(cin >> var)` 循环的停止条件取决于输入流的状态和用户输入方式。以下是三种主要停止机制: #### 1. **文件结束符(EOF)** 当检测到文件结束标志时,输入流会置位 `eofbit` 终止循环: - Windows:`Ctrl + Z` 后回车 - Linux/Mac:`Ctrl + D` ```cpp int num; while (cin >> num) { // 输入 EOF 时终止 // 处理 num } ``` #### 2. **类型不匹配输入** 当输入数据类型与变量类型不匹配时,流状态置位 `failbit`: ```cpp vector<int> nums; int x; while (cin >> x) { // 输入非数字(如字母)时终止 nums.push_back(x); } ``` #### 3. **检测换行符(交互式场景)** 通过 `cin.get()` 检测回车键实现单行输入终止: ```cpp vector<double> values; double temp; while (cin >> temp) { values.push_back(temp); if (cin.get() == '\n') break; // 回车结束输入 } ``` ### 关键机制说明 - **流状态转换**: `cin >> var` 返回 `cin` 对象本身,当流状态正常时转换为 `true`,异常时转换为 `false`。 触发错误的状态包括: - `eofbit`:输入结束(EOF) - `failbit`:格式错误(类型不匹配) - `badbit`:不可恢复错误(如设备故障) - **缓冲区特性**: 输入操作基于**空格/换行分隔**,连续输入 `1 2 3` 会被解析为三次循环迭代。 ### 应用场景对比 | 方法 | 适用场景 | 优点 | 缺点 | |--------------------|----------------------------|--------------------|--------------------| | EOF 终止 | 文件输入/批量数据处理 | 无需交互操作 | 需手动发送 EOF 信号| | 类型不匹配终止 | 未知数据量的自由输入 | 简单直接 | 需故意输入错误数据 | | 换行符检测终止 | 单行数据读取(如命令行输入)| 精确控制单行输入 | 对输入格式敏感 | ### 完整示例(单行输入处理) ```cpp #include <iostream> #include <vector> using namespace std; int main() { vector<string> words; string word; cout << "输入单词 (回车结束): "; while (cin >> word) { words.push_back(word); if (cin.get() == '\n') break; // 检测回车 } cout << "已输入: "; for (auto& w : words) cout << w << " "; } ``` > **运行逻辑**: > 输入 `apple banana cherry[回车]` → 循环执行 3 次后检测到 `\n` 终止 ### 注意事项 1. **混合输入问题**: 使用 `cin >> var` 后接 `getline()` 时,需用 `cin.ignore()` 清除残留换行符: ```cpp int id; string name; cin >> id; cin.ignore(); // 清除输入缓冲区中的 '\n' getline(cin, name); // 正常读取整行 ``` 2. **错误恢复**: 当输入类型错误时,需重置流状态并清除缓冲区: ```cpp while (!(cin >> num)) { cin.clear(); // 重置错误状态 cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空缓冲区 } ``` 3. **多平台兼容性**: EOF 信号在不同 OS 中的实现不同: - Windows: `Ctrl+Z` 必须位于行首 - Linux/Mac: `Ctrl+D` 可在任意位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值