2013-11-03 162 views
0

我希望我的程序从标准输入读取,直到EOF,打印所有输入,然后重复。我试图清除标准输入的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(); 

    } 

} 

第一输入被接收,并且打印后,然而,该方案只是无限打印“开始”,而无需等待进一步的输入。

+1

如何继续阅读过去的EOF?一旦没有更多的数据,*没有更多的数据。* –

+0

@JonathonReinhart EOF并不一定意味着永远不会有更多的数据,只有到达文件结尾。用户进入EOF转义后,终端可以继续提供输入,并且文件可以写入更多的数据。 – hobbs

+1

@hobbs我明白这一点。我实际上已经考虑了你提到的内容,但是想不到任何标准的UNIX-y程序在它从stdin获取EOF后继续尝试读取。如果我按Ctrl + D,我期望它完成。 –

回答

1

你服用不会有工作的做法 - 如果“CIN”给你最终的文件在你使用的情况下,则CIN被关闭。

对于您所陈述的宗旨,以“阅读文本,直到EOF,然后再次做”,对不起,以前还没有这样的细微差别,但如果你克隆的标准输入文件描述符然后用克隆,你可以继续阅读来自这些额外的文件描述符。

克隆iostreams并不容易。请参阅How to construct a c++ fstream from a POSIX file descriptor?

这有点类似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"; 
    } 
} 
0

那是因为你有printf(“开始”);在你的循环内部,所以你将在每次循环时重新打印它。

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

    } 

} 
+0

该程序第一次执行时,循环体等待输入。我希望它在每次迭代中等待。在循环之外移动print语句并没有什么帮助。仍然有对cout的写入,它会向控制台输出无数的空行,并清楚地表明该循环没有等待。 –

+0

如果你想每次都抓一条线(比如询问用户一个问题,然后输入回答,然后按回车键),那么也许使用getline()这样的东西可能会对你有所帮助。 http://www.cplusplus.com/reference/string/string/getline/ –

+0

我期待输入跨越任意数量的行。 –