我使用ifstream
打开一个FIFO文件。一旦对象创建,线程就会被阻塞,直到我向FIFO发送一些内容(这对我来说没问题)。然后我调用getline()
从流中读取数据。
如何再次阻塞线程,直到更多数据被写入FIFO文件?
谢谢
我使用ifstream
打开一个FIFO文件。一旦对象创建,线程就会被阻塞,直到我向FIFO发送一些内容(这对我来说没问题)。然后我调用getline()
从流中读取数据。
如何再次阻塞线程,直到更多数据被写入FIFO文件?
谢谢
我还没有测试过这段代码,但我想知道FIFO是否只是在读取所有可用数据时设置了EOF位。如果是这样的话,您可以尝试以下操作:
std::ifstream fifo;
std::string line;
bool done = false;
/* code to open your FIFO */
while (!done)
{
while (std::getline(fifo, line))
{
/* do stuff with line */
}
if (fifo.eof())
{
fifo.clear(); // Clear the EOF bit to enable further reading
}
else
{
done = true;
}
}
如果你读到了FIFO的末尾,请重置并等待更多数据。如果出现错误,则完成操作。我从这个网站获得了这个想法。在执行重置的同一代码块中可能还需要关闭和重新打开FIFO。
<string>
提供的 getline
函数返回流对象的引用。您可以测试此对象的“好处”,以查看它是否仍然打开或是否发生了错误:
std::ifstream fifo;
std::string line;
/* code to open your FIFO */
while (std::getline(fifo, line))
{
/* do stuff with line */
}
当FIFO关闭时,while测试将返回false以退出循环。每个循环迭代将有效地读取阻塞线程,直到有更多的数据准备好。
我使用流如下:
ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);
string CmdLine;
while (std::getline(_FifoInStream, CmdLine)) {
cout << CmdLine << endl;
}
我只有在初始化_FifoInStream变量,也就是打开流时才被阻塞。在将数据发送到FIFO后,我会通过while块掉下去。我需要的是每次从FIFO读取时无限期地被阻塞。
fifo.clear()
?std::ifstream
似乎没有reset()
方法。请参考 http://www.cplusplus.com/reference/iostream/ios/clear。 - Adi Shavit