我有一个FILE * (see GetHandle() == FILE*)
的类包装器..
我想为hasData
实现功能提问:
bool File::hasData(int waitSecs) {
fd_set set;
struct timeval tv;
FD_ZERO(&set);
FD_SET(fileno( GetHandle() ), &set);
tv.tv_sec = waitSecs;
tv.tv_usec = 0;
int res = select(fileno( GetHandle())+1, &set, NULL, NULL, &tv);
return res > 0;
}
事实证明FILE *有它的内部缓冲区(duh),所以除非我读取所有数据,select
将返回0直到我这样做,因此我找到了两个丑陋的方式,我可以查询FILE *句柄中的read ptr != write ptr
,并且我可以用NULL作为缓冲区调用setbuf
,这样就不会有任何内部缓冲,因此任何读取都会读取所请求的数量并选择将返回正数...
问题是..在给定FILE *和非托管读写的情况下,有更优雅的方法来实现这样的函数吗?