C++ 使用:while(cin>;>;x)和eof

C++ 使用:while(cin>;>;x)和eof,c++,C++,我不太确定我认为这是我的根本问题。我以前读过几篇关于while(cin>>x)的文章,但似乎没有什么能真正回答我的问题。 我使用此循环读取一些文本数据: while (cin >> x){ searchText.push_back(x); } 但在后面的代码中,我尝试使用以下方法读入一个单词: cout << "Please enter your target word: "; string targetWord; cin >> targetWord

我不太确定我认为这是我的根本问题。我以前读过几篇关于while(cin>>x)的文章,但似乎没有什么能真正回答我的问题。 我使用此循环读取一些文本数据:

while (cin >> x){
    searchText.push_back(x);
}
但在后面的代码中,我尝试使用以下方法读入一个单词:

cout << "Please enter your target word: ";
string targetWord;
cin >> targetWord;
cout>targetWord;
但是上面的while循环/eof似乎破坏了第二个代码段(如果我把第二个代码段移到上面,那么一切都很好,但显然这不是我想要做的)

编辑 以下是清晰的完整代码:

int main()
{
// ask for the target word
//   cout << "Please enter your target word: ";
//   string targetWord;
//   cin >> targetWord;

   // ask for and read the search text
   cout <<  "Enter the complete search text, "
            "followed by end-of-file: ";
   vector<string> searchText;
   string x;
   while (cin >> x){
      searchText.push_back(x);
   }

   // check that some text was entered
   typedef vector<string>::size_type vec_sz;
   vec_sz size = searchText.size();
   if (size == 0){
      cout << endl <<   "You must enter some text. "
                        "Please try again." << endl;
      return 1;
   }

// ask for the target word
   cin.clear();
   cout << "";
   cout << "Please enter your target word: ";
   string targetWord;
   cin >> targetWord;


   int count = 0;
   for (int i=0; i<size; ++i){
      if (targetWord == searchText[i]){
      count++;
      }
   }

   cout  << "The target word [" << targetWord << "] was "
            "in the search text " << count << " times." << endl;

   return 0;
}
intmain()
{
//询问目标词
//库特>特格沃德;
//询问并阅读搜索文本
cout>x){
搜索文本。向后推(x);
}
//检查是否输入了一些文本
typedef vector::size_type vec_sz;
vec_sz size=searchText.size();
如果(大小==0){
cout当
cin
(或任何其他
std::stream
)到达文件末尾时,它会设置一个状态以指示发生了这种情况

要重置此状态,您需要调用
cin.clear();
,这将清除任何“坏”状态,并确保流“正常”以再次使用。如果您正在读取文件,并且希望从头开始重新启动,这也适用

编辑:我只是把上面发布的代码放在我的机器上运行,在顶部添加

#include <iostream>
#include <vector>

using namespace std;
这就是我期望看到的

Edit2:为了完整性:使用
cin.clear()
的“成功率”取决于实现。更可靠的解决方案是在程序的第一阶段使用不同的方式标记字流的结尾。可以使用单个
或”!”或其他不应该在“字”中的东西-或更长的内容,如
“&&&&&&&”
,但这使得在输入15页时很难键入和记住。

cin
(或任何其他
std::stream
)到达文件末尾时,它会设置一个状态以指示已发生这种情况

要重置此状态,您需要调用
cin.clear();
,这将清除任何“坏”状态,并确保流“正常”以再次使用。如果您正在读取文件,并且希望从头开始重新启动,这也适用

编辑:我只是把上面发布的代码放在我的机器上运行,在顶部添加

#include <iostream>
#include <vector>

using namespace std;
这就是我期望看到的


Edit2:为了完整性:使用
cin.clear()
的“成功率”取决于实现。更可靠的解决方案是在程序的第一阶段使用不同的方式标记字流的结尾。可以使用单个
或”!”或其他不应该在“字”中的东西-或更长的内容,如
“&&&&&&&&”
,但这使得在输入中输入15页时很难键入和记住。

当执行离开循环时

while (cin >> x){
    searchText.push_back(x);
}
这样做是因为
cin
的“测试”返回false,换句话说,
failbit
和/或
badbit
已在流上设置。在这种情况下,任何进一步尝试从流读取的操作都将失败,即
targetWord
将保留为空


要使流再次可用,必须在执行离开循环时通过调用
cin.clear();

重置错误标志

while (cin >> x){
    searchText.push_back(x);
}
这样做是因为
cin
的“测试”返回false,换句话说,
failbit
和/或
badbit
已在流上设置。在这种情况下,任何进一步尝试从流读取的操作都将失败,即
targetWord
将保留为空


要使流再次可用,必须通过调用
cin.clear();

重置错误标志。如果我们知道 第一个循环,但基本上是:读取所有可用的输入, 然后再多读一些,你会惊讶地发现 失败。相反,我会感到惊讶

真正的问题是:你想做什么?基本上, 什么类型的
x
,我假设你是 假设
cin
是一个交互式设备,因为 提示如何确定第一个输入已被删除 完成?如果第一个循环因“文件结束”(用户)而结束 在Unix下输入control-D,或在Windows下输入control-Z),然后 你不可能可靠地期望阅读更多。重置
cin.clear()
的错误状态可能有效;它将导致
尝试从
streambuf
读取更多内容。但是 可能没有;在
istream下有任意数量的层
不管出于什么原因,它都可能记住了文件的结尾。
所以你必须找到一些不同的方法来识别
结束

只要从变量的名称猜测一下:如果您正在尝试 要阅读单词列表,我会使用带有空 列表末尾的行。因此第一个循环将成为:

while ( std::getline( std::cin, x ) && x != "" ) {
    searchText.push_back( x );
}
if ( ! std::cin ) {
    //  Something really bad has happened...
}
或者,您可能希望在白色上打断该行 空格,允许每行有一个以上的单词(并忽略任何 行中额外的空白:

std::string line;
while ( std::getline( std::cin, x ) && x != "" ) {
    std::istringstream l( line );
    while ( l >> x ) {
        searchText.push_back( x );
    }
}
if ( ! std::cin ) //  ...
<> >即使代码> x<代码>也有其他类型,您可能需要考虑
沿着这些思路的一些东西。

如果我们知道 第一个循环,但基本上是:读取所有可用的输入, 然后再多读一些,你会惊讶地发现 失败。相反,我会感到惊讶

真正的问题是:你想做什么?基本上, 什么类型的
x
,我假设你是 假设
cin
是一个交互式设备,因为 提示如何确定第一个输入已被删除 完成?如果第一个循环因“文件结束”(用户)而结束 在Unix下输入control-D,或在Windows下输入control-Z),然后 你不可能
joe@joe-HPlaptop:~$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.