نظام أساسي مشترك (linux/Win32) غير محظور C++ IO على stdin/stdout/stderr

StackOverflow https://stackoverflow.com/questions/315111

سؤال

أحاول العثور على أفضل حل لعدم حظر الإدخال والإخراج عبر stdin/stdout بالخصائص التالية:

  • طالما أن هناك ما يكفي من البيانات، اقرأ ن- قطع بحجم .
  • إذا لم تكن هناك بيانات كافية، فاقرأ في جزء جزئي.
  • إذا لم تكن هناك بيانات متاحة، قم بالحظر حتى يتوفر بعضها (على الرغم من أنها قد تكون أصغر من ن).

الهدف هو السماح بالنقل الفعال لمجموعات البيانات الكبيرة أثناء معالجة رموز "التحكم" على الفور (بدلاً من تركها في مخزن مؤقت مملوء جزئيًا في مكان ما).

أعلم أنه يمكنني تحقيق ذلك باستخدام سلاسل الرسائل وحلقة istream::get()، أو عن طريق كتابة مجموعة من التعليمات البرمجية الخاصة بالنظام الأساسي (نظرًا لأنه لا يمكنك تحديد() على مقابض الملفات في النوافذ)...((يوجد أيضًا istream::readsome() والذي يبدو واعدًا، ولكن النتائج الوحيدة التي يمكنني العثور عليها على Google كانت لأشخاص يقولون إنها لا تعمل بشكل جيد بالفعل.))

نظرًا لأنني لم أقم بالكثير من الترميز مع واجهات برمجة التطبيقات هذه، فربما تكون هناك طريقة أفضل.

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

المحلول

ربما دفعة::اسيو يمكن أن تكون مفيدة بالنسبة لك؟

نصائح أخرى

لقد استخدمت المواضيع والرمز الخاص بالمنصة.يرى جوابي على سؤال آخر.لقد تمكنت من وضع العناصر الخاصة بنظام التشغيل في inputAvailable () (يستخدم Linux التحديد، ويعود Windows فقط صحيحًا).يمكنني بعد ذلك استخدام WaitForSingleObject() مع انتهاء المهلة على نظام التشغيل Windows لمحاولة إكمال سلسلة المحادثات، ثم TerminateThread() لإيقافها.قبيح للغاية، لكن الفريق لم يرغب في استخدام هذا القدر من التعزيز.

لقد فعلت شيئًا مشابهًا لـ jwhitlock ...انتهى بي الأمر بفئة StdinDataIO التي تلتف حول التنفيذ المناسب لنظام التشغيل (*) حتى يتمكن باقي برنامجي من تحديد () على واصف الملف الذي يوفره StdinDataIO، ويظل جاهلاً بسعادة بقيود Windows فيما يتعلق بـ stdin.الق نظرة هنا و هنا إذا أردت، فإن الكود كله مفتوح المصدر/مرخص من BSD.

(*) يعد التنفيذ بمثابة تمرير بسيط لنظام التشغيل Linux/MacOSX، وفي نظام التشغيل Windows يعد عملية معقدة إلى حد ما تتمثل في إعداد سلسلة رسائل فرعية للقراءة من stdin وإرسال البيانات التي تتلقاها عبر المقبس مرة أخرى إلى سلسلة المحادثات الرئيسية. .ليست أنيقة جدا، ولكنها تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top