ملخص
المدخلات هي الحدّ الذي يدخل منه العالم إلى البرنامج، والعالم لا يحترم المواصفات. يعلّم هذا الدرس القراءة دون ثقة: قراءة أسطر كاملة بـ std::getline وتجنّب السطر الفارغ الذي يظهر عند خلطها بـ >>؛ والاستعلام عن حالة المجرى والتمييز بها بين ثلاث حالات لم يرها الدرس المدخلات والمخرجات والأخطاء إلا مختلطة (المعطى غير الصالح، والعدد الذي لا يتسع له نوعه، ونهاية المعطيات)؛ والاستدراك بعد قراءة فاشلة بـ clear وignore؛ ثم، بوصفها الطريقة الأكثر أمانًا، قراءة كل معطى نصًّا وتحويله بـ std::from_chars، وعدم قبوله إلا إذا استهلك التحويل النص كله. ويُختم بدالة readInt، مع عقدها، يمكن لبقية الدورة أن تعيد استعمالها.
أهداف التعلم
- قراءة أسطر كاملة بـ
std::getline، وتفسير سبب إعادةgetlineالتي تلي قراءةً بـ>>سطرًا فارغًا، وتجنّب ذلك بـstd::ws. - الاستعلام عن حالة المجرى بعد القراءة بـ
fail()وeof()، والتمييز بها بين معطى غير صالح، وعدد لا يتسع له نوعه، ونهاية الإدخال. - كتابة حلقة قراءة تستدرك بعد إدخال غير صالح بـ
clearوignore، وتنتهي إذا انتهى الإدخال. - التحقق من صحة عدد مقروء نصًّا بـ
std::from_chars، باشتراط ألا يقع خطأ وأن تُستهلك السلسلة النصية كلها، وتغليف التحقق في دوال ذات عقد.
الحدّ، مرة أخرى
أثبت الدرس المدخلات والمخرجات والأخطاء ثلاث حقائق عن std::cin >> n: القراءة تتوقف، دون أن تستهلكه، عند أول محرف لا يمكن أن يواصل العدد؛ وإن لم تفلح في قراءة أي محرف، دخل المجرى في حالة الخطأ ولم تعد أي قراءة لاحقة تفعل شيئًا؛ وif (std::cin) يتيح معرفة ما إذا فشل شيء. وأضاف الدرس الحلقات أن الشرط while (std::cin >> value) ينتهي سواء انتهى الإدخال أو وصل معطى غير صالح. غير أن البرنامج، بهذه الأدوات، يكتشف أن شيئًا ما قد ساء، لكنه لا يعرف ما هو ولا يستطيع أن يفعل شيئًا سوى الاستسلام.
ينطلق هذا الدرس من مبدأ في التصميم، هو مبدأ البرمجة الدفاعية عند الحدّ: كل معطى يدخل يُتحقق من صحته قبل استعماله، والبرنامج الذي يتحقق منه يميّز المعطى غير الصالح، الذي يقبل التصحيح (طلبه مرة أخرى، أو تخطيه، أو الإبلاغ عنه)، من نهاية المعطيات، التي لا تقبله. وإذا كان الأمر كذلك، لزمت ثلاثة أشياء: قراءة المعطى كما كُتب، أي سطرًا؛ ومعرفة سبب فشل القراءة؛ وإعادة القدرة على القراءة إلى المجرى.
جارٍ تحميل المحتوى…