14

我使用“cin”从输入流中读取单词,例如

int main( ){
     string word;
     while (cin >> word){
         //do sth on the input word
     }

    // perform some other operations
}

代码结构与上述类似。它是可编译的。在执行过程中,我不断输入类似

aa bb cc dd

我的问题是如何结束这个输入?换句话说,假设文本文件只是“aa bb cc dd”。但我不知道如何让程序知道文件结束了。

4

11 回答 11

20

你的代码是正确的。如果您是交互式输入,则需要发送 EOF 字符,例如 CTRL-D。

读取文件时不需要此 EOF 字符。这是因为一旦您到达输入流的末尾,就没有任何东西可以“cin”了(因为流现在已关闭),因此 while 循环退出。

于 2011-03-19T04:44:28.920 回答
7

由于其他人已经回答了这个问题,我想补充一点:

由于 Windows 上的 Ctrl-Z(和 unix 系统上的 Ctrl-D)导致 EOF 到达,并且您退出while循环,但在while循环之外您无法读取进一步的输入,因为 EOF 已经到达。

因此,要再次启用读取使用cin,您需要清除eof标志以及所有其他失败标志,如下所示:

cin.clear();

完成此操作后,您可以cin再次使用开始读取输入!

于 2011-03-19T05:15:00.163 回答
3
int main() {
     string word;
     while (cin >> word) {
         // do something on the input word.
         if (foo)
           break;
     }
    // perform some other operations.
}
于 2011-03-19T04:45:46.000 回答
1

按 Ctrl-Z(在 *nix 系统上按 Ctrl-D)并按 Enter。这会发送一个 EOF 并使流无效。

于 2011-03-19T04:43:38.000 回答
1

cin >> some_variable_or_manipulator将始终评估对 的引用cin。如果您想检查是否还有更多输入要读取,您需要执行以下操作:

int main( ){
     string word;
     while (cin.good()){
         cin >> word;
         //do sth on the input word
     }

    // perform some other operations
}

这会检查流的 goodbit,当 eofbit、failbit 或 badbit 均未设置时,它将设置为 true。如果读取错误,或者流接收到 EOF 字符(到达文件末尾或用户在键盘上按下 CTRL+D),cin.good() 将返回 false,并让您脱离环形。

于 2011-03-19T08:24:12.353 回答
0

我猜你想在文件末尾跳出。您可以获得basic_ios::eof的值,它在流结束时返回 true。

于 2011-03-19T04:48:55.000 回答
0

从文件中获取输入。然后你会发现当你的程序停止接受输入时while循环终止了。cin当它找到 EOF 标记时,实际上会停止输入。每个输入文件都以此 EOF 标记结尾。当遇到此 EOF 标记时,operator>>它将内部标志的值修改eofbit为 false,因此 while 循环停止。

于 2014-07-09T23:43:34.237 回答
0

它可以帮助我通过按 ENTER 来终止循环。

int main() {
    string word;
    while(getline(cin,word) && s.compare("\0") != 0) {
        //do sth on the input word
    }

    // perform some other operations
}
于 2016-04-19T07:22:13.107 回答
0

您可以检查输入中的特殊单词。Fe“停止”:

int main( ){
   string word;

   while (cin >> word){
      if(word == "stop")
          break;

      //do sth on the input word
   }

// perform some other operations
}
于 2017-02-20T14:07:14.900 回答
0

你可以试试这个

    string word;
    vector<string> words;
    while (cin >> word) {
                                            
        words.push_back(word);
        if (cin.get() == '\n')
            break;
    }

这样,您不必以 CTRL+D(Z) 结尾。程序将在句子结束时退出

于 2021-02-27T09:25:50.400 回答
-1

您的程序不计算空格。区分cin和getline...

这是一个带有技巧的示例:程序获取输入并打印输出,直到您按两次 Enter 退出:

#include <iostream>
#include <string>
using namespace std;

int main(){


    char c = '\0';
    string word;
    int nReturn = 0;

    cout << "Hit Enter twice to quit\n\n";

    while (cin.peek())
    {
        cin.get(c);

        if(nReturn > 1)
            break;
        if('\n' == c)
            nReturn++;
        else
            nReturn = 0;
        word += c;
        cout << word;
        word = "";
    }

    cout << endl;
    return 0;
}
于 2016-09-08T13:26:32.800 回答