2009-01-26 49 views
3

我打開一個FIFO文件爲ifstream。只要對象被創建,線程就會被阻塞,直到我發送一些東西進入FIFO(這對我來說沒問題)。然後我打電話getline()從流中獲取數據。通過ifstream對象阻止從FIFO讀取

如何再次讀取阻塞線程,直到更多數據寫入FIFO文件?

由於

回答

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

<string>提供的getline函數返回流對象的引用。您可以測試這個對象的「善」,看它是否仍然是開放的,或者如果發生錯誤:

std::ifstream fifo; 
std::string line; 

/* code to open your FIFO */ 

while (std::getline(fifo, line)) 
{ 
    /* do stuff with line */ 
} 

當FIFO關閉時,而測試將返回false退出循環。每循環迭代將有效地讀取阻塞線程,直到更多數據準備就緒。

0

我使用流如下:

ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in); 

string CmdLine; 

while (std::getline(_FifoInStream, CmdLine)) { 
    cout << CmdLine << endl; 
} 

我阻塞只有當我初始化_FifoInStream變量即打開該流。在將數據發送到FIFO後,我通過while塊。我需要的是每次讀取時都無限期地從FIFO讀取數據。

+0

發送數據後關閉FIFO嗎?例如,如果你使用echo命令發送數據,echo會打開FIFO,發送數據並關閉它。我做的是 – Arkadiy 2009-01-27 15:55:09

+0

。回聲正是我使用的。 – jackhab 2009-01-29 13:15:26