0

我希望我的程序从标准输入读取直到 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();

  }

}

然而,在接收并打印第一个输入之后,程序只是无限打印“Begin”而不等待进一步的输入。

4

2 回答 2

1

您在那里采用的方法将不起作用 - 当 'cin' 在您使用的上下文中为您提供文件结尾时,则 cin 关闭。

对于您声明的“读取文本直到 eof,然后再做一次”的目的,很抱歉之前错过了这个细微差别,但是如果您克隆标准输入文件描述符然后使用克隆,您可以继续从这些附加文件描述符中读取。

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

这有点像 c,但是这段代码会消耗一个标准输入的副本,直到标准输入关闭,然后它会制作一个新的副本并消耗它,然后继续。

#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";
    }
}
于 2013-11-05T19:31:43.437 回答
0

那是因为你有 printf("begin"); 在您的循环内,因此您每次循环时都会再次打印它。

循环不会等待输入,因此每次从标准输入读取数据时 - 如果那里没有任何内容,它会立即获取 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();

  }

}
于 2013-11-03T05:02:12.423 回答