معالجة الأخطاء والحالة
تحقّق من حالة التدفق
معالجة الأخطاء والحالة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
أعلام حالة الدفق
يتتبع كل دفق حالته باستخدام أعلام الحالة:
- goodbit: كل شيء سليم.
- eofbit: تم الوصول إلى نهاية الملف.
- failbit: خطأ منطقي (تنسيق غير صحيح).
- badbit: خطأ خطير في الإدخال والإخراج.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("missing_98765.txt");
std::cout << std::boolalpha << "good: " << in.good() << '\n';
return 0;
}اختبار الدفق
يتحول الدفق إلى bool؛ وتكون قيمته true عندما يكون صالحًا للاستخدام. ويكتشف if (!in) الفشل بإيجاز.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("nope_55555.txt");
if (!in) std::cout << "stream not usable\n";
else std::cout << "ok\n";
return 0;
}good وeof وfail وbad
لكل علم أسلوب استعلام: good() وeof() وfail() وbad().
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("abc");
int x;
s >> x; // fails: not a number
std::cout << std::boolalpha;
std::cout << "fail: " << s.fail() << '\n';
std::cout << "bad: " << s.bad() << '\n';
return 0;
}فشل الاستخراج
عندما يتعذر على >> تحليل النوع المتوقع، فإنه يضبط failbit ويترك الهدف دون تغيير.
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("hello");
int n = -1;
if (!(s >> n)) std::cout << "could not read an int, n stays " << n << '\n';
return 0;
}مسح الحالة
بمجرد ضبط أحد أعلام الفشل، يظل الدفق غير صالح للاستخدام حتى تستدعوا clear() لإعادة ضبطه.
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("x 42");
int n;
s >> n; // fails on 'x'
s.clear(); // reset state
std::string word;
s >> word; // now reads 'x'
std::cout << "recovered: " << word << '\n';
return 0;
}تجاهل الإدخال غير الصحيح
بعد استدعاء clear()، استخدموا ignore() للتخلص من المحارف المسببة للمشكلة قبل إعادة المحاولة.
#include <iostream>
#include <sstream>
#include <limits>
int main() {
std::istringstream s("bad 100");
int n;
while (!(s >> n)) {
s.clear();
s.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
}
std::cout << "read " << n << '\n';
return 0;
}التمييز بين نهاية الملف والخطأ
بعد انتهاء حلقة القراءة، تحقّقوا مما إذا كانت قد انتهت بشكل سليم عبر eof() أو بسبب فشل حقيقي عبر bad().
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("1 2 3");
int x;
while (s >> x) {}
std::cout << std::boolalpha << "reached eof: " << s.eof() << '\n';
std::cout << "hardware error: " << s.bad() << '\n';
return 0;
}التحقق بعد الفتح
تحقّقوا دائمًا من الدفق فور فتح الملف، لكي تفشلوا مبكرًا عند وجود مسار مفقود أو يتعذر قراءته.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in("absent_11111.txt");
if (!in.is_open()) {
std::cout << "open failed, aborting\n";
return 1;
}
std::cout << "never reached\n";
return 0;
}تفعيل الاستثناءات
يمكنكم مطالبة الدفق بإطلاق استثناءات عند حدوث الأخطاء باستخدام exceptions()، مما يحوّل حالات الفشل الصامتة إلى std::ios_base::failure يمكن التقاطها.
#include <iostream>
#include <fstream>
int main() {
std::ifstream in;
in.exceptions(std::ios::failbit);
try {
in.open("ghost_22222.txt");
} catch (const std::exception& e) {
std::cout << "caught open failure\n";
}
return 0;
}التحقق من أعداد البايتات المقروءة
بعد إجراء read ثنائي، يعرض gcount() عدد البايتات التي قُرئت فعليًا، مما يتيح لكم اكتشاف عمليات القراءة غير المكتملة.
#include <iostream>
#include <fstream>
int main() {
int v = 9;
std::ofstream("g.bin", std::ios::binary).write(reinterpret_cast<const char*>(&v), sizeof(v));
int out;
std::ifstream in("g.bin", std::ios::binary);
in.read(reinterpret_cast<char*>(&out), sizeof(out));
std::cout << "read " << in.gcount() << " bytes\n";
return 0;
}حلقة قراءة متينة
اجمعوا بين الأساليب: اختبروا الدفق داخل الحلقة، ثم ميّزوا بعد انتهائها بين الانتهاء السليم ووقوع خطأ.
#include <iostream>
#include <sstream>
int main() {
std::istringstream s("5 10 15");
int total = 0, x;
while (s >> x) total += x;
if (s.eof()) std::cout << "sum = " << total << " (clean)\n";
else std::cout << "error during read\n";
return 0;
}اختبار سريع
اختبروا فهمكم لحالة الدفق.
خلاصة
لقد تعلمتم التعامل مع أخطاء الدفق:
- أعلام الحالة good/eof/fail/bad، التي يمكن الاستعلام عنها باستخدام أساليبها أو باختبار الدفق باعتباره قيمة منطقية
- تعيد
clear()ضبط الحالة، بينما تتخلصignore()من الإدخال غير الصحيح - ميّزوا بين
eof()السليم والأخطاء الحقيقية؛ إذ يمكن لـexceptions()إطلاق استثناءات، ويتحققgcount()من عمليات القراءة الثنائية
الدورة التالية: إنشاء أعداد عشوائية باستخدام <random>.
الأسئلة الشائعة
هل درس «معالجة الأخطاء والحالة» مجاني؟
نعم — نص درس «معالجة الأخطاء والحالة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «معالجة الأخطاء والحالة»؟
تحقّق من حالة التدفق تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «معالجة الأخطاء والحالة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة الملفات باستخدام ifstream
- كتابة الملفات باستخدام ofstream
- إدخال وإخراج الملفات الثنائية
- معالجة الأخطاء والحالة