我正在使用std::ifstream::read
從管道(Linux)或管道類設備對象(Windows)讀取數據。但是,當沒有更多數據時,read
讀取0個字節並設置EOF
。有沒有辦法阻止從ifstream
讀取數據,這樣只有在有更多數據時纔會返回?阻止讀取std :: ifstream
我寧可不等待EOF
標誌清除。
如果C++標準庫不可能,那麼最接近的其他選項是什麼?我可以用普通的C語言來做到這一點,還是我不得不求助於操作系統特定的API?
我正在使用std::ifstream::read
從管道(Linux)或管道類設備對象(Windows)讀取數據。但是,當沒有更多數據時,read
讀取0個字節並設置EOF
。有沒有辦法阻止從ifstream
讀取數據,這樣只有在有更多數據時纔會返回?阻止讀取std :: ifstream
我寧可不等待EOF
標誌清除。
如果C++標準庫不可能,那麼最接近的其他選項是什麼?我可以用普通的C語言來做到這一點,還是我不得不求助於操作系統特定的API?
不幸的是,std
在任何非算法功能(如IO)上都很差。你總是必須依賴第三方解決方案。幸運的是,有Boost,如果你不介意的話,我會建議使用它來減少操作系統特定的代碼。
namespace bs = boost::iostreams;
int fd; // Create, for example, Posix file descriptor and specify necessary flags for it.
bs::file_descriptor_source fds(fd);
bs::stream<bs::file_descriptor_source> stream(fds);
// Work with the stream as it is std stream
在我使用Boost IO Streams並且具體file_descriptor_source
,它作爲一個基礎流裝置和內部隱藏Windows或Posix的特定管這個小的例子。您打開自己的管道,以便您可以根據需要配置管道。
好吧,似乎沒有辦法做一個阻塞閱讀。清除錯誤位不會有幫助。只有重新打開就像這個例子FIFO的:
int main(int argc, char **argv)
{
int rc=0;
enum FATAL {ERR_ARGV,ERR_OPEN_FILE};
try
{
if(argv[1] == NULL) throw ERR_ARGV;
std::ifstream fifo;
while(1)
{
fifo.open(argv[1],std::ifstream::in);
if(!fifo.is_open()) throw ERR_OPEN_FILE;
std::string line;
while(std::getline(fifo,line))
{
std::cout << line << "\n"; fflush(stdout);
}
fifo.close();
}
// never should come here
}
catch(FATAL e)
{
rc=e;
switch(e)
{
case ERR_ARGV:
std::cerr << "ERROR: argument 1 should be a fifo file name\n";
break;
case ERR_OPEN_FILE:
std::cerr << "ERROR: unabel to open file " << argv[1] << "\n";
break;
}
}
return(rc);
}
我已經測試此代碼和它的作品從FIFO做無盡的讀取。
謝謝,我會試試看。不幸的是,在Windows上安裝Boost非常複雜,只需將它全部寫入WinApi中即可開始使用;-)。 – jdm
如果你正在使用MinGW,你可以使用'packman'來根據這個軟件包庫[Alexpux Packages](https://github.com/Alexpux/MINGW-packages)進行安裝。 – Yuki
而對於Visual Studio有[這些二進制文件](https://sourceforge.net/projects/boost/files/boost-binaries/1.64.0/) – Yuki