std :: istream :: read不会阻塞?

时间:2016-08-07 12:41:23

标签: c++

简而言之,当我管道数据少于它需要时,它不会等待。源代码:

#include <iostream>

using namespace std;

int main(){
  char buf[1024];
  cin.read(buf, 5);
  buf[5]='\0';
  cout<<buf<<endl;
}

g ++ foo.cpp
  echo“123”| ./a.out

  

123

如果我直接运行./a.out,程序将等到我输入5个字符。

2 个答案:

答案 0 :(得分:3)

read读取字符,直到它读取指定数量的字符或遇到流结束。

  • 管道数据时,系统知道流何时结束并发送结束 流相应的信号。
  • 当您通过交互式设备发送数据时,系统不会 知道你是否发送了你想要的所有数据,或者你想输入更多数据,所以它 问你,等待输入。您可以发送流结束信号 在Linux上按Ctrl + D手动指定不会 任何进一步的输入。

如果您可以使用stream.fail()检查上次操作是否失败(没有读取所有请求的字符)和stream.gcount()来检查实际读取的字符数。

答案 1 :(得分:2)

我已将您的代码更新为以下

#include <iostream>
using namespace std;

int main(){
  char buf[1024];
  do{
    cin.read(buf, 5);
    buf[5]='\0'; // can be moved out of loop (placed after while)
  }while(cin.gcount() < 5);
  cout<< "Result is >" << buf << "<" <<endl;
}

现在程序正在等待,直到至少有5个字符被读取到buf,但您应该知道\n也是cin流中的字符,因为用户按了Enter键< / p>