2009-01-26 3 views
3

Открываю файл FIFO как ifstream. Как только объект создается, поток блокируется, пока я не отправил что-то в FIFO (для меня это нормально). Затем я вызываю getline(), чтобы получить данные из потока.Блокировка чтения из FIFO через объект ifstream

Как я могу читать-блокировать поток снова, пока в файл 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 в том же блоке, где вы выполняете сброс.

+3

Ожидает ли это занят? Когда мы перезагружаем бит EOF, который останавливает EOF, и мы вращаемся? –

+0

Не хотите сказать 'fifo.clear()'? 'std :: ifstream', похоже, не имеет метода' reset() '. См. Http://www.cplusplus.com/reference/iostream/ios/clear –

+0

Исправлено, спасибо, что заметили. –

1

getline функция, обеспечиваемая <string> возвращает ссылку на объект потока. Вы можете проверить этот объект для «добра», чтобы увидеть, если он все еще открыт, или если произошла ошибка:

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

/* code to open your FIFO */ 

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

Когда FIFO закрывается, тест в то время как будет возвращать ложь, чтобы выйти из цикла. Каждая итерация цикла будет эффективно читать - блокировать поток до тех пор, пока больше данных не будет готово.

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

+0

я. Эхо - это именно то, что я использую. – jackhab