Frage

Ich öffne eine FIFO-Datei als ifstream. Sobald das Objekt der Thread blockiert wird, erstellt wird, bis ich etwas in den FIFO senden (das für mich in Ordnung ist). Dann rufe ich getline() die Daten aus dem Stream zu erhalten.

Wie kann ich Lese-Block den Faden wieder, bis mehr Daten in den FIFO-Datei geschrieben wird?

Danke

War es hilfreich?

Lösung

Ich habe diesen Code nicht getestet, aber ich frage mich, ob der FIFO einfach ist die EOF-Bit-Einstellung, wenn Sie alle verfügbaren Daten zu lesen. In diesem Fall könnten Sie in der Lage sein, dies zu tun:

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;
    }
}

Wenn Sie das Ende der FIFO abgelesen, zurückgesetzt und weitere Daten warten. Wenn ein Fehler aufgetreten ist, sind Sie fertig. Ich habe die Idee für diese von dieser Website . Möglicherweise müssen Sie auch in der Nähe und das FIFO in dem gleichen Block wieder öffnen, wo Sie den Reset durchführen.

Andere Tipps

Die getline Funktion durch <string> versehen gibt einen Verweis auf das Strom-Objekt. Sie können dieses Objekt für „Güte“ testen, um zu sehen, ob es noch geöffnet ist oder wenn ein Fehler aufgetreten ist:

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

/* code to open your FIFO */

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

Wenn der FIFO schließt, wird der während Test false zurück, die Schleife zu verlassen. Jede Schleifeniterationslatenzzeit effektiv den Faden Lese blockieren, bis mehr Daten bereit ist.

Ich verwende den Strom wie folgt:

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

string CmdLine;

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

Ich bin nur blockiert, wenn ich initialisieren _FifoInStream Variable heißt den Strom öffnen. Nachdem ich Daten in FIFO senden falle ich durch den während der Block. Was ich brauche, ist von dem FIFO zu lesen, auf unbestimmte Zeit jedes Mal auf Lese blockiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top