通过ifstream对象阻止从FIFO读取

时间:2009-01-26 17:05:56

标签: c++ file-io filestream fifo

我打开一个FIFO文件为ifstream。一旦创建了对象,线程就会被阻塞,直到我向FIFO发送内容(这对我来说没问题)。然后我调用getline()从流中获取数据。

在将更多数据写入FIFO文件之前,如何再次读取线程?

由于

3 个答案:

答案 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中读取。