سؤال

لدي تطبيق يقوم بتنفيذ غلاف تفاعلي، مشابه لكيفية عمل Python console/irb.المشكلة الآن هي أنه إذا قام المستخدم بالضرب عن طريق الخطأ ^D يتم إصدار EOF وبلدي getline() يُرجع call سلسلة فارغة أعاملها على أنها "لا يوجد إدخال" ويعرض المطالبة مرة أخرى.

يؤدي هذا بعد ذلك إلى حلقة لا نهاية لها تطبع المطالبة.

الآن في بايثون سأحل هذه المشكلة عن طريق اللحاق EOFError, ، ولكن في C++ لم يتم طرح أي استثناء يمكنني التقاطه ولا يبدو أن هناك إعدادًا قيد التشغيل cin لتجاهل EOF.

أي تلميحات؟

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

المحلول 2

وتصحيح الحل بفضل litb:

if (!getline(std::cin, str)) {
    std::cin.clear();
    std::cout << std::endl;
}

نصائح أخرى

إذا لم يتمكن من قراءة أي شيء، فإنه يحدد failbit.ما عليك سوى اختبار الدفق في حالة if، ومسح الجزء:

if(!getline(std::cin, myline)) {
    std::cin.clear();
    std::cout << "you should enter something" << std::endl;
}

داخليًا، يكون التسلسل بهذه الطريقة في حالتك:

  • انتظر على المحطة للحصول على سلسلة.سيتم حظر الوحدة الطرفية حتى يرسل المستخدم سطرًا جديدًا.حالتان من حالات الخطأ المحتملة ممكنة
    1. يضغط المستخدم على الفور على EOF.هذا سيجعل getline قراءة أي شيء على الإطلاق، وسوف يحدد failbit و ال eofbit.
    2. يقوم المستخدم بإدخال شيء ما ثم يضغط على EOF.هذا سيجعل getline تستهلك شيئًا ما ثم تضغط على EOF أثناء محاولتها الحصول على الشخصية التالية.هذا السبب eofbit للإعداد.
  • ستحاول قراءة شيء ما مرة أخرى.ستقوم وظيفة الاستخراج بإنشاء كائن من النوع istream::sentry الذي يتحقق في حالة الدفق.إذا تم تعيين أي من بتات الخطأ، فسيؤدي ذلك إلى عودة وظيفة الاستخراج على الفور.وهذا تسبب في الحلقة التي لا نهاية لها من قبل.

دعوة ل clear() يمسح كافة أجزاء الخطأ، ويمكنك الاستمرار في قراءة الأشياء الخاصة بك مرة أخرى.

ال getline() تشير الدالة إلى أخطاء باستخدام البتات التالية:

  • com.eofbit
  • com.failbit
  • com.badbit

حاول التحقق من ذلك قبل المتابعة.

http://www.horstmann.com/cpp/pitfalls.html

يمكنك استخدام رمز مثل:

while (cin)
{  int x;
   cin >> x;
   if (cin) a.push_back(x);
}

حسنًا، في الإجابات الأخرى، تم وصف استخدام cin.clear() كحل ممكن.

الحيلة الأخرى هي أنك تستخدم وسائل أخرى لمعالجة الإدخال من وحدة التحكم بخلاف المعيار النموذجي عن طريق ضبط الجهاز على وضع آخر حتى تتمكن من معالجة Ctrl + D مباشرة.في وضع RAW أو غيره، يمكنك الحصول على مزيد من الوصول المباشر إلى تسلسلات الإدخال والتحكم من جانب المستخدم (مثل Ctrl+D أو Ctrl+C) التي لم تعد تتم معالجتها في أي مكان آخر.

قد تحاول بعض المكتبات جمع المزيد من المعلومات (أو حتى توفير وقت البرمجة):

½ يمكنك العثور على بعض المعلومات حول مشكلتك في المستندات هنا.

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