سؤال

وI فتح ملف FIFO كما ifstream. حالما يتم إنشاء الكائن يتم حظر موضوع حتى أبعث شيء في FIFO (والذي هو موافق بالنسبة لي). ثم أدعو getline() للحصول على البيانات من الدفق.

وكيف يمكنني قراءة كتلة الخيط مرة أخرى حتى يتم كتابة المزيد من البيانات في ملف FIFO؟

والشكر

هل كانت مفيدة؟

المحلول

وأنا لم تختبر هذا الرمز ولكن أنا أتساءل إذا كان 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، إعادة تعيين وانتظر المزيد من البيانات. إذا حدث خطأ، أنت القيام به. خطرت لي فكرة عن هذا من هذا الموقع . قد تضطر إلى أيضا وثيقة وإعادة فتح FIFO في نفس الكتلة حيث كنت تفعل إعادة التعيين.

نصائح أخرى

وظيفة getline التي تقدمها <string> بإرجاع مرجع إلى كائن تيار. يمكنك اختبار هذا الكائن ل "الخير" لمعرفة ما اذا كان لا يزال مفتوحا أو إذا حدث خطأ:

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

/* code to open your FIFO */

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

عند إغلاق FIFO، فإن الاختبار حين عودة كاذبة للخروج من الحلقة. كل حلقة تكرار وفعال للقراءة كتلة موضوع حتى المزيد من البيانات مستعدة لذلك.

ويمكنني استخدام الدفق كما يلي:

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

string CmdLine;

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

وأنا منعت فقط عندما تهيئة _FifoInStream متغير أي فتح الدفق. بعد أن ترسل البيانات إلى FIFO I تقع من خلال كتلة الوقت. ما احتاج اليه هو القراءة من FIFO إلى أجل غير مسمى في كل مرة يتم حظر على القراءة.

scroll top