繁体   English   中英

反复从标准输入读到EOF

[英]Repeatedly reading to EOF from stdin

我希望程序从stdin读取到EOF,然后打印所有输入并重复。 我尝试清除stdin的EOF状态,如下所示:

#include <string>
#include <iostream>
#include <iterator>

using namespace std;

int main() {

  cin >> noskipws;

  while (1) {

    printf("Begin");
    istream_iterator<char> iterator(cin);
    istream_iterator<char> end;
    string input(iterator, end);
    cout << input << endl;
    cin.clear();

  }

}

但是,在接收并打印了第一个输入后,程序将无限次打印“开始”,而无需等待进一步的输入。

您所采用的方法行不通-当'cin'在您所使用的上下文中为您提供文件结尾时,cin被关闭。

为了达到您所说的“读取文本直到eof,然后再做一次”的目的,对于以前错过的细微差别,我们深感抱歉,但是如果克隆stdin文件描述符然后使用克隆,则可以继续从这些其他文件描述符中进行读取。

克隆iostream并不容易。 请参阅如何从POSIX文件描述符构造c ++ fstream?

它有点像c,但是这段代码将清空stdin的一个副本,直到该stdin关闭,然后再创建一个新副本并清空它,然后继续。

#include <iostream>
#include <string>

void getInput(std::string& input)
{
    char buffer[4096];
    int newIn = dup(STDIN_FILENO);
    int result = EAGAIN;
    input = "";
    do {
        buffer[0] = 0;
        result = read(newIn, buffer, sizeof(buffer));
        if (result > 0)
            input += buffer;
    } while (result >= sizeof(buffer));
    close(newIn);

    return input;
}

int main(int argc, const char* argv[])
{
    std::string input;
    for (;;) {
        getInput(input);
        if (input.empty())
            break;
        std::cout << "8x --- start --- x8\n" << input.c_str() << "\n8x --- end --- x8\n\n";
    }
}

那是因为你有printf(“ begin”); 在循环中,这样您就可以在每次循环时再次打印它。

循环不会等待输入,因此每次它从stdin中读取数据时-如果没有任何内容,它将立即获得EOF,因此继续循环直到存在某些数据。

让我知道这是否没有道理-还是我完全理解错了。

例如:

#include <string>
#include <iostream>
#include <iterator>

using namespace std;

int main() {

  cin >> noskipws;

  printf("Begin");

  while (1) {

    istream_iterator<char> iterator(cin);
    istream_iterator<char> end;
    string input(iterator, end);
    cout << input << endl;
    cin.clear();

  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM