我正在使用std::ifstream
从Linux上的命名管道中读取。如果文件的写入结束,我无法继续通过流读取管道。出于某种原因,我必须再次clear()
,close()
和open()
来继续阅读。这是预期的吗?当作者close() open()
和close()
随意管道时,如何避免管道上的open()
?
背景:我认为我必须做的close() open()
会导致作者有时会收到我想避免的SIGPIPE
。
更多详细信息 - 我正在使用此代码来读取流
// read single line
stream_("/tmp/delme", std::ios::in|std::ios::binary);
std::getline(stream_, output_filename_);
std::cout << "got filename: " << output_filename_ << std::endl;
#if 0
// this fixes the problem
stream_.clear();
stream_.close();
stream_.open("/tmp/delme", std::ios::in|std::ios::binary);
// now the read blocks until data is available
#endif
// read more binary data
const int hsize = 4096+4;
std::array<char, hsize> b;
stream_.read(&b[0], hsize);
std::string tmp(std::begin(b), std::begin(b)+hsize);
std::cout << "got header: " << tmp << std::endl;
/tmp/delme
是我的烟斗。我做echo "foo" > /tmp/delme
我在foo
中得到output_filename_
但是流不会阻塞,(它应该,没有更多的数据),它继续读取垃圾。如果我启用ifdef
内的代码,它就可以运行。为什么呢?
谢谢, 塞巴斯蒂安
答案 0 :(得分:0)
由于您使用std :: getLine(),可能需要使用额外的&#34; \ n&#34;表示一行的结束:
echo -e "foo\n" > /tmp/delme
而不仅仅是
echo "foo" > /tmp/delme
至少应该摆脱垃圾阅读。