我打开一个FIFO文件为ifstream
。一旦创建了对象,线程就会被阻塞,直到我向FIFO发送内容(这对我来说没问题)。然后我调用getline()
从流中获取数据。
在将更多数据写入FIFO文件之前,如何再次读取线程?
由于
答案 0 :(得分:3)
我还没有测试过这段代码,但我想知道当你读取所有可用数据时,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的末尾,请重置并等待更多数据。如果发生错误,您就完成了。我从this website得到了这个想法。您可能还必须在执行重置的同一个块中关闭并重新打开FIFO。
答案 1 :(得分:1)
getline
提供的<string>
函数返回对流对象的引用。您可以测试此对象是否“良好”以查看它是否仍处于打开状态或是否已发生错误:
std::ifstream fifo;
std::string line;
/* code to open your FIFO */
while (std::getline(fifo, line))
{
/* do stuff with line */
}
当FIFO关闭时,while测试将返回false以退出循环。每次循环迭代都会有效地读取阻塞线程,直到更多数据准备就绪。
答案 2 :(得分:0)
我按如下方式使用流:
ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);
string CmdLine;
while (std::getline(_FifoInStream, CmdLine)) {
cout << CmdLine << endl;
}
我只在初始化_FifoInStream变量时才被阻止,即打开流。在我将数据发送到FIFO后,我会通过while块。我需要的是每次在读取时被无限期地从FIFO中读取。